|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Помогите с запросом, свой select с 10 вложенными подзапросами непонравился ) Есть регистр движения пациента по отделениям поля owner - пациент, datedvig - дата/время движения. Пользователь вводит параметр "Дата" и должен получить поля owner, max(datedvig) до параметра, min(datedvig) после параметра. максимальную дату "до параметра" нашел, как прикрутить минимальную дату "после параметра"? Код: sql 1. 2. 3.
Firebird 2.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 15:07 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
И да ньюанс ) параметр типа date поле типа datetime и соответственно в течении дня несколько записей может быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 15:24 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Код: sql 1. 2. 3. 4.
(только убедитесь, что на таблице 'dvig' висят два индекса - по возрастанию и убыванию поля datedvig). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 15:46 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepalsпараметр типа date поле типа datetime и соответственно в течении дня несколько записей может быть. И сколько из этих записей ты хочешь получить? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 16:29 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepals, и сколько таких записей может быть - за день, за год? Есть вообще смысл вычислять Max, если известно, что ЗАВТРА пациента все равно еще нигде нет, потому что оно не наступило? Есть ли смысл вычислять дату первого поступления? Может быть, просто выдать все записи, а дальше фильтровать локально "снизу вверх и сверху вниз..."? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 17:05 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Ну раз нужны подробности тогда так: CREATE TABLE DRIVINGPATIENT ( OWNER KEYS NOT NULL /* KEYS = CHAR(16) */, -- Карта пациента DATEON DATE_TIME NOT NULL /* DATE_TIME = TIMESTAMP */, --Дата и время движения TYPE_DRIVING KEYS NOT NULL /* KEYS = CHAR(16) */,--Тип движения DEPARTMENT KEYS /* KEYS = CHAR(16) */,--Отделение ); Входящие параметры DEPARTMENT и DATEON Запрос должен вернуть данные по пациентам находящимся в отделении на указанную дату. Чтобы найти отделение пациента нужно найти для его карты(OWNER) последнее движение(max(DATEON)) с типом(TYPE_DRIVING)=1. для пациента поступившего сегодня 19.09.2015 сделано 3 движения: 9:00 - TYPE_DRIVING=0 (направлен в отделение) 10:00 - TYPE_DRIVING=1 (поступил в отделение) 11:00 - TYPE_DRIVING=2 (Выписан) на входной параметр по этому отделению DATEON=19.09.2015. надо найти строчку "10:00 - TYPE_DRIVING=1 (поступил в отделение)" -нашли отделение где он был. а потом найти первую следующую строчку с любым типом движения - "11:00 - TYPE_DRIVING=2 (Выписан)" разница между этими датами это кол-во дней которые пациент провел в отделении. Таблоид, индексы то есть, но только твой запрос не вернет то что надо :( kdv, карт - много, движений в карте крайне сомнительно, что больше 10. Max c типом движения = 1 вычисляется для поиска отделения, а вот запись MIN может отсутствовать, в зависимости находится ли пациент в отделении сейчас? Если еще не выписали записи MIN нет. Отчёт может делаться на любую дату как на сегодня(где у текущих пациентов движения выписан нет), так и на год назад, где все выписаны. P.S. насчёт выдать все записи, первое поле MAX это лишь подзапрос-фильтр для основного запроса по картам. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 18:06 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Вот так неудачная структура БД доставляет проблем разработчикам приложений. Всё было бы гораздо проще, если бы пребывание пациента в отделении контролировалось таблицей с полями ("поступил в отделение", "отбыл с отделения"). А так тебе прямая дорога к Execute Block или хранимой процедуре. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 18:26 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepalsТаблоид, индексы то есть, но только твой запрос не вернет то что надо :(да, не вернёт: я забыл в скалярные подзапросы добавить условие по owner.id. А ты привёл DDL таблицы, но забыл/поленился привести пример данных, в виде insert'ов (ИБЭ это позволяет сделать в полпинка). Давай сюда 10-15 строк, тогда проще будет понять, что там. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 18:43 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Таблоид, не забыл и поленился, а структуру для упрощения резал) и сокращал): и о ужас, про проблему одного дня знал, но сейчас до другого ньюанса дошел. более печального. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
Входной параметр - 19.09.2015 k1 - поступил и выписан раньше - не подходит. k2 - поступил сегодня и выписан сегодня - ПОДХОДИТ! Кол-во дней в отделении: 0 k3 - поступил сегодня выписан завтра - подходит. Кол-во дней: 1 k4 - поступил завтра = не подходит Dimitry Sibiryakov, про структуру БД так каждый новоприбывший программист говорит )) и зачастую не по делу)), если делать столбцы "прибыл" "убыл" то надо и другие столбцы тянуть совсем необязательные для всех строк, да сами прибыл убыл тоже не обязательны, бывает все заканчивается движением "направлен" и неоформляемым движением "пошелнахертыздоров" т.е. в отделение он ни поступал и не выписывался) но направлялся) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 19:51 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepalsесли делать столбцы "прибыл" "убыл" то надо и другие столбцы тянуть совсем необязательные для всех строк Зачем? Третью НФ нынче отменили?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 20:04 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Меня конечно больше САБЖ интересует, но это я хотел спросить как это связано с 3НФ? ) Dimitry Sibiryakovтаблицей с полями ("поступил в отделение", "отбыл с отделения"). как запишешь в эти поля пациента1 который имеет одно движение "Направлен в отделение" поля "поступил в отделение", "отбыл с отделения" должны быть null,null как запишешь второго пациента у которого 2 движения "Поступление в отделение" и "Перемещение внутри отделения" т.е. поступил но не отбыл, перемещение внутри отделения куда писать? новое поле лепить? Что-то поле "отбыл с отделения" как раз попахивает избыточностью не связанной с 3НФ. Хотя не видел еще ни одной БД где бы не жертвовали 3НФ ради удобства писать запросы и производительности. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 20:42 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepalsя хотел спросить как это связано с 3НФ? ) Напрямую: тащить в таблицу истории нахождения пациента в отделении левые поля с тем, чтобы дублировать информацию в них - нарушение этой НФ. sdepalsкак запишешь в эти поля пациента1 который имеет одно движение "Направлен в отделение" Никак. Он не был в отделении вообще. sdepalsкак запишешь второго пациента у которого 2 движения "Поступление в отделение" и "Перемещение внутри отделения" т.е. поступил но не отбыл, Так и запишу: "поступил тогда-то" и "никогда не отбыл". То, что его с койки на койку переложили не меняет факта нахождения в отделении, который и отображается в твоём отчёте. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 21:29 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, мне кажется, тут исходно была попытка какого-то документооборота. А так, действительно, вроде д.б. таблица пациент, отделение, прибыл, убыл. А что с пациентом происходило в отделении (или вообще) - отдельная таблица. Впрочем, возможно что зря я влез, но исходное сообщение уже сразу намекало, что в структуре что-то не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.09.2015, 21:45 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepalsМеня конечно больше САБЖ интересует, но это я хотел спросить как это связано с 3НФ? ) Dimitry Sibiryakovтаблицей с полями ("поступил в отделение", "отбыл с отделения"). как запишешь в эти поля пациента1 который имеет одно движение "Направлен в отделение" поля "поступил в отделение", "отбыл с отделения" должны быть null,null как запишешь второго пациента у которого 2 движения "Поступление в отделение" и "Перемещение внутри отделения" т.е. поступил но не отбыл, перемещение внутри отделения куда писать? новое поле лепить? Что-то поле "отбыл с отделения" как раз попахивает избыточностью не связанной с 3НФ. Хотя не видел еще ни одной БД где бы не жертвовали 3НФ ради удобства писать запросы и производительности. Перемещение внутри отделения, это как? Из одной палаты в другую, или в реанимацию? Тогда надо атомарить не отделения, а все возможные точки нахождения пациентов. И да, "время прибыл в точку" - "время убыл с точки", как уже написал Dimitry Sibiryakov. Если "время убыл" null, то пациент находится в текущий момент времени в этой точке, если надо найти, где был пациент неделю назад, то ищем запись с требуемыми границами. Точки естественно подчинены отделениям больницы, другим больницам, в качестве точек могут выступать операционные, транспортные средства, собственный дом пациента и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.09.2015, 18:33 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepalsХотя не видел еще ни одной БД где бы не жертвовали 3НФ ради удобства писать запросы и производительности. Ну это лишь значит, что не видел :) Такие таблицы перемещений возникают постоянно. И постоянно люди пишут к ним многоэтажные запросы, чтобы всего лишь понять: "Был он там или нет в интересующее нас время?". Проходит время, а с ним приходит осознание. И добавление столбца с датой ухода из данного статуса сразу облегчает жизнь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2015, 13:06 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
afgmИ постоянно люди пишут к ним многоэтажные запросы, чтобы всего лишь понять От БД сильно зависит, если с этими запросами проблемы, то варианта всего 2 - неверная архитектура или неверный выбор БД. p.s. Никто не мешает ещё и parent_id (id_income по аналогии со складом ) для операций перемещения использовать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2015, 00:08 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
sdepalsно это я хотел спросить как это связано с 3НФ? А так, что человек может одновременно находиться только в одном месте. И в этом месте он находится от времени D1 (timestamp) до времени D2 (timestamp). При этом D2 может быть Null, если человек еще не переместился из этого места. Если же человек получает направление, куда-то, то это является бумажкой, или вектором, т.е. свойством бумажки, которая получена в момент D3. И D3 вовсе не является свойством человека. Бумажку он получил в 8 утра, а переместился в отделение - в 9 утра. И т.д. У вас в таблицу ради экономии связаны события, имеющие разные типы. Сейчас вы выкручиваетесь из ситуации, когда начало и конец события разнесены по 2м разным записям. Если вы добавите столбец timestamp в эту таблицу, тогда будете выкручиваться из другой ситуации, потому что у события "получил направление" нет окончания. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2015, 01:31 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
kdv, что-то я ответил на старое сообщение, извините, зачитался. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2015, 01:32 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
NikolayV81afgmИ постоянно люди пишут к ним многоэтажные запросы, чтобы всего лишь понять От БД сильно зависит, если с этими запросами проблемы, то варианта всего 2 - неверная архитектура или неверный выбор БД. p.s. Никто не мешает ещё и parent_id (id_income по аналогии со складом ) для операций перемещения использовать. Я вот такой СУ БД не знаю, где можно это легко разрулить не переписывая структуры или не создавая дополнительных объектов. Поделитесь? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2015, 13:31 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
afgm, Поддерживающие оконные функции? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2015, 15:46 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
NikolayV81Поддерживающие оконные функции? Скрипт Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Как узнать где был пользователь user_id =1 в '2015-09-05 15:00'? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.09.2015, 17:07 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
afgm, Код: sql 1. 2. 3. 4.
Вопрос неправильный, одиночная запись находится легко. А вот найти сразу для таблицы дат, для разных сотрудников - вот тут уже начинаются треугольные велосипеды. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 09:43 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
WildSeryА вот найти сразу для таблицы дат, для разных сотрудников - вот тут уже начинаются треугольные велосипеды. с оконными функциями колёса покруглей будут Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 10:05 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
Симонов Денис, Это только для разных сотрудников. А теперь для разных дат попробуй. Пусть так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Цель санитара - составить отчёт о местах где больного настиг очередной укол. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 10:18 |
|
Запрос, как найти соседние строки?
|
|||
---|---|---|---|
#18+
WildSeryВопрос неправильный, одиночная запись находится легко. А вот найти сразу для таблицы дат, для разных сотрудников - вот тут уже начинаются треугольные велосипеды. Ну зачем же так сразу. Я планировал вывести на это автора поста не с первой итерации :) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.10.2015, 12:12 |
|
|
start [/forum/topic.php?fid=40&msg=39065445&tid=1562615]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 145ms |
0 / 0 |