Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird - Выгрузка случайных строк / 25 сообщений из 33, страница 1 из 2
19.06.2015, 12:26
    #38987761
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Добрый день. Есть задачка, но не могу ее решить.
Есть таблица с врачами, пациентами и лечениями. (doctor(dcode),clients(pcode),treat(dcode,pcode,treatdate))
Необходимо выгрузить 30 случайных врачей за прошлый день. Потом к каждому врачу по 3 случайных пациента.

Получаю 30 случайных врачей:
select first 30 distinct t.dcode from treat t where t.treatdate between :data and :data order by rand()

Потом привязываю к ним всех пациентов за эту дату:
select distinct d.fullname,c.fullname
from
(select first 30 distinct t.dcode dcode from treat t where t.treatdate between :data and :data order by rand()) doc
left join doctor d on doc.dcode = d.dcode
left join treat t on t.dcode = d.dcode
left join (select t.pcode pcode, t.dcode dcode from treat t where t.treatdate between :data and :data ) client on client.pcode = t.pcode and client.dcode = doc.dcode
left join clients c on c.pcode = client.pcode
where t.treatdate between :data and :data

Получается 30 врачей со всеми своими пациентами. Как мне оставить по 3 записи pcode(пациента) для каждого dcode(врача)?
...
Рейтинг: 0 / 0
19.06.2015, 12:50
    #38987824
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.,

бред какой-то
...
Рейтинг: 0 / 0
19.06.2015, 12:58
    #38987836
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Бред в чем, в задаче или в коде? Если в коде, не спорю, первое что пришло на ум.
...
Рейтинг: 0 / 0
19.06.2015, 13:15
    #38987876
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.,

в задаче
...
Рейтинг: 0 / 0
19.06.2015, 13:20
    #38987888
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Какая бы задача не была, но она есть.
Необходимо для статистики получить 30 случайных врачей с 3 пациентами.
...
Рейтинг: 0 / 0
19.06.2015, 13:30
    #38987918
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
знаем мы эту статистику
...
Рейтинг: 0 / 0
19.06.2015, 14:08
    #38988031
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Подскажите, как мне получить желаемое?
...
Рейтинг: 0 / 0
19.06.2015, 14:14
    #38988044
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
сперва нужно четко сформулировать критерии отбора этих самых записей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2015, 14:28
    #38988076
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.,
Ну может как-то вот так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select distinct D.Fullname, C.Fullname
  from (select first 30 distinct T.Dcode Dcode
          from Treat T
          where T.Treatdate = :Data
          order by rand()) Doc

    left join(select first 3 P.Pcode
                from Treat P
                where T.Treatdate = :Data
                  and P.Dcode = Doc.Dcode
                order by rand()) Client on 1 = 1

    left join Doctor D on D.Dcode = Doc.Dcode
    left join Clients C on C.Pcode = Client.Pcode 
...
Рейтинг: 0 / 0
19.06.2015, 14:45
    #38988119
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Для чего это нужно. Клиника осуществляет прием пациентов. Руководство хочет знать отзывы от самих пациентов. Отзывы получает call-centr.
Данная выгрузка нужна для call centr-а, чтобы они знали - кого им нужно обзванивать.
Обзванивают они пациентов. У пациента получают информацию по клиники и по врачу, которые его принимал.
Было принято решение сделать выгрузку из БД.
В отчете необходимо видеть:
ФИО Врача1, ФИО пациента1, телефон
ФИО Врача1, ФИО пациента2, телефон
ФИО врача1, ФИО пациента3, телефон
ФИО Врача2, ФИО пациента1, телефон
ФИО Врача2, ФИО пациента2, телефон
ФИО врача2, ФИО пациента3, телефон

Т.е. Для каждого врача необходимо вывести по 3 случайных пациента, которые были у него на приеме в тот день.

Все лечения хранятся в бд treat(строки pcode,dcode,treatdate).
Все врачи хранятся в бд doctor(строки dcode(уникальный номер врача), fullname(ФИО))
Все пациенты хранятся в бд clients(строки pcode(уникальный номер пациента),fullname(ФИО),bdate,phone).

Была идея выгрузить всех врачей с пациентами за определенный день, сделать кол-во строк для каждого доктора по 3 и потом с помощью first и order by rand() отсортировать их случайно.
...
Рейтинг: 0 / 0
19.06.2015, 14:55
    #38988133
pastor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.Была идея выгрузить всех врачей с пациентами за определенный день, сделать кол-во строк для каждого доктора по 3 и потом с помощью first и order by rand() отсортировать их случайно.

Отличная идея. Как раз для temp table.
...
Рейтинг: 0 / 0
19.06.2015, 15:03
    #38988151
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
m7m,

Спасибо что откликнулись. Я подобное пробовал, тут не получается
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select distinct D.Fullname, C.Fullname
  from (  select first 30 distinct t.dcode dcode
          from Treat T
          where T.Treatdate between :data and :data
          order by rand()) Doc

    left join(select first 3 p.dcode dcode
                from Treat P
                where P.Treatdate between :data and :data
                  and P.Dcode = Doc.Dcode -- в этой строке он ругается, т.к. не видит, что раньше она была объявлена.
                order by rand()) Client on 1 = 1
    left join Doctor D on D.Dcode = Doc.Dcode
    left join Clients C on C.Pcode = Client.Pcode




З.Ы Firebird 2.5.2
...
Рейтинг: 0 / 0
19.06.2015, 15:06
    #38988155
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
pastor,

Хорошо, тогда подскажите пожалуйста по поводу автор сделать кол-во строк для каждого доктора по 3
...
Рейтинг: 0 / 0
19.06.2015, 15:12
    #38988170
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.не получается
Ну так перестань впихивать невпихуемое и пиши простенький Execute Block с тривиальным
вложенным FOR SELECT.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2015, 15:22
    #38988193
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.,
Ну да действительно ругается
значит так не судьба

зы. тогда прислушайся к совету Dimitry Sibiryakov
...
Рейтинг: 0 / 0
19.06.2015, 15:25
    #38988204
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.,

SELECT d.dcode, c.pcode
FROM treat t
JOIN (SELECT dcode FROM doctor ORDER BY UUID_TO_CHAR(GEN_UUID()) ROWS 30) d ON d.dcode = t.dcode
JOIN (SELECT pcode FROM clients ORDER BY UUID_TO_CHAR(GEN_UUID()) ROWS 3) c ON c.dcode = d.dcode
WHERE t.treatdate between :data and :data

вроде так
...
Рейтинг: 0 / 0
19.06.2015, 15:32
    #38988220
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Dimitry Sibiryakov,

Спасибо, будем пробовать. Если вас не затруднит не большой шаблон, пример или направление куда копать.
...
Рейтинг: 0 / 0
19.06.2015, 15:33
    #38988223
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
MaratIsk,
Код: sql
1.
2.
3.
4.
5.
SELECT d.dcode, c.pcode 
FROM treat t 
JOIN (SELECT dcode FROM doctor ORDER BY UUID_TO_CHAR(GEN_UUID()) ROWS 30) d ON d.dcode = t.dcode
JOIN (SELECT pcode FROM clients ORDER BY UUID_TO_CHAR(GEN_UUID()) ROWS 3) c ON c.dcode = d.dcode -- в таблице clients нету строки dcode, только pcode
WHERE t.treatdate between :data and :data
...
Рейтинг: 0 / 0
19.06.2015, 15:37
    #38988232
MaratIsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.MaratIsk,
Код: sql
1.
2.
3.
4.
5.
SELECT d.dcode, c.pcode 
FROM treat t 
JOIN (SELECT dcode FROM doctor ORDER BY UUID_TO_CHAR(GEN_UUID()) ROWS 30) d ON d.dcode = t.dcode
JOIN (SELECT pcode FROM clients ORDER BY UUID_TO_CHAR(GEN_UUID()) ROWS 3) c ON c.dcode = d.dcode -- в таблице clients нету строки dcode, только pcode
WHERE t.treatdate between :data and :data



хорошо а где еще pcode ?
...
Рейтинг: 0 / 0
19.06.2015, 15:39
    #38988244
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.Если вас не затруднит не большой шаблон, пример или направление куда
копать.
Это надо понимать как "документацию я не читал и не собираюсь, дайте готовый код чтобы его
можно было скопипастить"?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2015, 15:40
    #38988245
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
MaratIsk,

Все лечения хранятся в бд treat(столбцы pcode,dcode,treatdate).
Все врачи хранятся в бд doctor(столбцы dcode(уникальный номер врача), fullname(ФИО))
Все пациенты хранятся в бд clients(столбцы pcode(уникальный номер пациента),fullname(ФИО),bdate,phone).
...
Рейтинг: 0 / 0
19.06.2015, 15:42
    #38988250
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Dimitry Sibiryakov,
Готовый я не прошу, т.к. пока сам не напишешь, никогда не научишься. Не большой пример, алгоритм, последовательность, мб операторы которые пригодятся. Даже хороший help подойдет.
...
Рейтинг: 0 / 0
19.06.2015, 15:52
    #38988273
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Hello, Денис П.!
You wrote on 19 июня 2015 г. 15:52:16:

Денис П.> Даже хороший help подойдет.
http://www.firebirdsql.org/file/documentation/reference_manuals/Firebird_Language_Reference_RUS.pdf
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2015, 15:54
    #38988275
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
Денис П.Даже хороший help подойдет.
А официальный
Language
Reference
для тебя недостаточно хорош?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.06.2015, 15:55
    #38988278
Денис П.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Firebird - Выгрузка случайных строк
хм, не видел его, спасибо!
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird - Выгрузка случайных строк / 25 сообщений из 33, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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