powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложный запрос
25 сообщений из 38, страница 1 из 2
Сложный запрос
    #39463385
Всем привет, большая проблема, очень нужна помощь((
Есть база пациентов, случаев очень много, на данный момент 5 миллионов, ну и каждый месяц естественно добавляются новые. Задача в том, что нужно выбрать повторные случаи, то есть, если один и тот же человек с одним полисом посещал несколько раз медицинское учреждение, ну и плюс кое-какие условия, типа совпадает специальность врача, цель посещения и т.д, то тогда эти случаи нужно отобрать. В базе есть разные таблицы, основная - случай лечения, которая соединяется с таблицей пациентов. Один и тот же человек может быть в таблице пациентов под несколькими id.
Проблема в том, что когда там много записей процедура, отбирающая эти случаи отрабатывает ооооочень долго. Ну естественно, потому что таблица объединяется сама с собой... Как быть в такой ситуации? Может быть у кого-то было что-то похожее? Каким образом можно попытаться ускорить? Дайте совет пожалуйста (
...
Рейтинг: 0 / 0
Сложный запрос
    #39463390
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут нужен программист, освоивший язык SQL до слов GROUP BY и HAVING.
А соединять таблицу с собой при этом совсем не нужно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложный запрос
    #39463396
Dimitry Sibiryakov, нельзя просто сгруппировать по номеру полису и взять >1. Одно из условий на дату посещения, если больше 15 дней, то повторным уже не считается
...
Рейтинг: 0 / 0
Сложный запрос
    #39463398
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кареглазая_заянельзя
Можно.

Кареглазая_заяесли больше 15 дней, то повторным уже не считается
А если было четыре посещения с периодом в две недели каждое, это как считается?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложный запрос
    #39463400
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кареглазая_зая> нельзя

Зачем спорить, если элементарно не хватает квалификации?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложный запрос
    #39463401
Dimitry Sibiryakov, все 4 должны быть отобраны. Первый потому что у него есть второе посещение и разница дней между ними не больше 15, у второго третье, у третьего четвертое
...
Рейтинг: 0 / 0
Сложный запрос
    #39463406
Гаджимурадов Рустам, я не спорю. А говорю, что обычной группировкой тут не обойдешься
...
Рейтинг: 0 / 0
Сложный запрос
    #39463412
Вот примерная структура
r_pacient : id, polis, dr
r_schet : id, id_type
r_sl : id, id_schet, id_r_pacient, dt_end, mkb, pos, nomlpu

Выбрать r_schet.id, r_sl.id , r_sl.nomlpu, такие, что
возраст (r_pacient.dr) < 65
посещения (r_sl.dt_end)между двумя случаями <16
исключить r_sl.mkb на букву O, r_schet.id_type 1, пары с r_sl1.pos = 2 , а r_sl2.pos =1, если r_sl1.dt_end < r_sl2.dt_end

Помогите пожалуйста тогда написать запрос!
...
Рейтинг: 0 / 0
Сложный запрос
    #39463421
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select .... from r_sl rsl1 join r_schet on ... join r_pacient on ...
where
current_date - r_pacient.dr < 65*365 and
mkb not starting with 'O' and
r_schet.id_type <> 1 and
exists (select * from r_sl rsl2 where rsl2.id_r_pacient = rsl1.id_r_pacient and
    abs(rsl1.dt_end-rsl2.dt_end)<16 and
    (rsl1.dt_end > rsl2.dt_end or (rsl2.pos = 2 and rsl1.pos = 1)))


Как-то так.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложный запрос
    #39463441
Dimitry Sibiryakov, как-то так я сейчас и делаю. Правда соединять надо не по id_r_pacient, а по полису. Но таблица r_sl очень большая, можно ли каким-нибудь образом exists заменить?
...
Рейтинг: 0 / 0
Сложный запрос
    #39463442
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я бы вообще запросом не делал, а набросал ХП, в которой
можно было бы спокойно учесть все предикаты, нюансы и
перламутровые пуговицы, которые через неделю всплывут.
Заодно подзапроса можно будет выкинуть, одного цикла хватит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложный запрос
    #39463443
Гаджимурадов Рустам, ХП - хранимая процедура?
...
Рейтинг: 0 / 0
Сложный запрос
    #39463446
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кареглазая_заятаблица r_sl очень большая, можно ли каким-нибудь образом exists заменить?Я бы в 1-ю очередь обратил внимание на join'ы - они по-умолчанию inner, если я не ошибаюсь.
Если есть возможность, лучше заменять их на left/right [outer] join'ы - они работают "в один проход" при чем "с нужной стороны", в отличие от inner.
Например, если к основной таблице чз left join присоединить другую с записями по ключу - такое соединение пройдет наиболее безболезненно по времени.

Что касается exists - он работает быстро, ведь он в WHERE и не участвует в соединении таблиц, а только в фильтрации результата.
Можно попробовать и приджойнить "себя же" и в WHERE только даты сравнивать, но я очень сомневаюсь, что будет быстрее.

Да, еще, основное условие "mkb not starting with 'O'" ужасно, по полю mkb с таким условием индекс сомневаюсь, что получится использовать.
...
Рейтинг: 0 / 0
Сложный запрос
    #39463448
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, а долго будет в любом случае, т.к. условия идут по второстепенным таблицам, а значит наверняка перебираются все записи основной большой таблицы не по индексу.

Чтобы хоть часть отсечь в таком случае - придется основной таблицей делать пациентов - их можно по возрасту по индексу фильтрануть.
...
Рейтинг: 0 / 0
Сложный запрос
    #39463467
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЕсли есть возможность, лучше заменять их на left/right [outer] join'ы - они работают "в один проход" при чем "с нужной стороны", в отличие от inner.
Например, если к основной таблице чз left join присоединить другую с записями по ключу - такое соединение пройдет наиболее безболезненно по времени.

А давай ты не будешь говорить о том в чём совсем не смыслишь. Оба твоих сообщения полнейшая чушь
...
Рейтинг: 0 / 0
Сложный запрос
    #39463517
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кареглазая_заяОдин и тот же человек может быть в таблице пациентов под несколькими id.
Бардак.
...
Рейтинг: 0 / 0
Сложный запрос
    #39463615
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanКареглазая_заяОдин и тот же человек может быть в таблице пациентов под несколькими id.
Бардак.
Надо Дока звать, он предметную часть знает.
...
Рейтинг: 0 / 0
Сложный запрос
    #39463629
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кареглазая_заякак-то так я сейчас и делаю.
Тогда в полный рост встаёт вопрос планов, статистики, наличия индексов и прочий высший
пилотаж. Раз уж хитроподвывернутые условия так криво ложатся на схему БД.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложный запрос
    #39463643
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarНадо Дока звать
не надо, "я еще не волшебник..." © :)

С wadman согласен на 146%, бардак полнейший. Полис ОМС у россиянина один на всю жизнь. А тут ТС даже структуры базы нормально показать не может. Трудно ей будет у нас ;)
...
Рейтинг: 0 / 0
Сложный запрос
    #39463648
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кареглазая_зая,

Код: sql
1.
2.
3.
4.
select полис, специализация, count(*), min(Дата), max(Дата)
from Посещения
group by полис, специализация
having (max(Дата) - min(Дата)) > 14
...
Рейтинг: 0 / 0
Сложный запрос
    #39463682
Док, сложно, я просто не знаю как объяснить по-нормальному, чтобы и ненужных вещей не говорить и в тоже время суть.
А насчет id пациента, никакого бардака нет. Такую информацию передает Фонд ОМС, а связано с тем, что пациенты выгружаются помесячно - счетами, и соответственно в каждом счете id пациента уникально, а счетов мб много. Такая структура.
...
Рейтинг: 0 / 0
Сложный запрос
    #39463687
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисYuRockЕсли есть возможность, лучше заменять их на left/right [outer] join'ы - они работают "в один проход" при чем "с нужной стороны", в отличие от inner.
Например, если к основной таблице чз left join присоединить другую с записями по ключу - такое соединение пройдет наиболее безболезненно по времени.

А давай ты не будешь говорить о том в чём совсем не смыслишь. Оба твоих сообщения полнейшая чушь
Окей, чушь, но я написал всё это исходя из своего опыта и своего понимания, как это всё работает.

P.S. Ты утверждаешь, что inner и left join'ы -одинаковы по быстродействию, т.е. для сервера работы одинаковое количество для этих двух видов соединения таблиц?
Я считаю, что нет, и left легче, а ты написал - что это полная чушь.
Так вот, повторяю вопрос: "Ты утверждаешь, что inner и left join'ы -одинаковы по быстродействию, т.е. для сервера работы одинаковое количество для этих двух видов соединения таблиц?"
...
Рейтинг: 0 / 0
Сложный запрос
    #39463689
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПолис ОМС у россиянина один на всю жизнь.
За свою недолгую жизнь я в прошлом году получил уже третий полис. Так шта...
...
Рейтинг: 0 / 0
Сложный запрос
    #39463695
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

твой опыт весьма поверхностный. Я привык доверять оптимизатору и только если меня не устраивает быстродействие, то рассматриваю как можно самостоятельно оптимизировать запрос. Золотое правило не пытаться преждевременно оптимизировать.
И да в случае inner join вариантов выполнения много больше. Оптимизатор может принять лучшее решение и только если он это делает неправильно нужно рассматривать другие варианты.
...
Рейтинг: 0 / 0
Сложный запрос
    #39463702
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисYuRock,
Я привык доверять оптимизатору и только если меня не устраивает быстродействие, то рассматриваю как можно самостоятельно оптимизировать запрос. Золотое правило не пытаться преждевременно оптимизировать.
И да в случае inner join вариантов выполнения много больше. Оптимизатор может принять лучшее решение и только если он это делает неправильно нужно рассматривать другие варианты.
Именно так я и поступаю тоже всегда. Сдесь же ТС обратился с просьбой дать идеи, как попробовать оптимизировать запрос, который выполняется "оооочень долго". Я дал свои советы, исходя из своего опята.

Симонов ДенисОба твоих сообщения полнейшая чушь.

Симонов Дениствой опыт весьма поверхностный.

Тут можешь продолжать и дальше, меня подобные высказывания не трогают.

Только ты ответь: Ты действительно считаешь чушью (как ты и написал), что left легче inner? Или просто у самого чушь вырвалась случайно?
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]