powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос на выборку по максимальной дате
17 сообщений из 17, страница 1 из 1
запрос на выборку по максимальной дате
    #39843297
Reginar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем день добрый!
Помогите, пожалуйста с запросом.

есть таблица (пример содержимого)
ID DT type employeeID1 03.06.19 8:44:25 1 55942 03.06.19 8:45:21 1 51393 03.06.19 8:46:03 1 71074 03.06.19 8:48:15 1 11505 03.06.19 12:44:04 2 55946 03.06.19 12:47:12 1 94617 03.06.19 14:04:28 2 71078 03.06.19 17:34:25 1 10049 03.06.19 18:43:14 2 946110 03.06.19 19:34:15 1 9214

нужно из нее вывести строки с данными, где по каждому employeeID последний отмеченный type равен 1

у меня максимум что получилось, вывести последнюю дату по каждому employeeID, а как к ним приклеить правильный type никак не пойму.

Спасибо
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39843355
leonid_85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Reginar,
select max(dt),type,empid from temp where type='1' group by type,empid;
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39843393
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reginar,

"последний" по DT или по ID ?

Код: sql
1.
2.
3.
4.
5.
6.
7.
select tr.* from temp tr
,lateral
        (SELECT id, type FROM temp td
             WHERE td.empid = tr.empid 
             ORDER BY td DESC [, id DESC] LIMIT 1) td
WHERE tr.id = td.id and td.type = 1
 
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844068
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
25.
26.
27.
28.
29.
select id,dt,type,employeeID from (
                                      select *, last_value(type) over (partition by employeeID order by id) as last
                                      from (
                                               select 1                  as id,
                                                      '03.06.19 8:44:25' as dt,
                                                      1                  as type,
                                                      5594               as employeeID
                                               union
                                               select 2, '03.06.19 8:45:21', 1, 5139
                                               union
                                               select 3, '03.06.19 8:46:03', 1, 7107
                                               union
                                               select 4, '03.06.19 8:48:15', 1, 1150
                                               union
                                               select 5, '03.06.19 12:44:04', 2, 5594
                                               union
                                               select 6, '03.06.19 12:47:12', 1, 9461
                                               union
                                               select 7, '03.06.19 14:04:28', 2, 7107
                                               union
                                               select 8, '03.06.19 17:34:25', 1, 1004
                                               union
                                               select 9, '03.06.19 18:43:14', 2, 9461
                                               union
                                               select 10, '03.06.19 19:34:15', 1, 9214
                                           ) as t
                                  ) as t
where last=1
order by id
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844090
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Reginar,

Что то тут переусложненные варианты советуют (хотя и рабочие).

Почитайте про DISTINCT ON https://www.postgresql.org/docs/11/sql-select.html#SQL-DISTINCT

Код: plsql
1.
2.
3.
4.
5.
SELECT * FROM
(
   SELECT DISTINCT ON (employeeID) * FROM SOMETABLE ORDER BY employeeID, DT DESC
) AS _t
WHERE type=1;



как то так.
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844145
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
верно,

но при некоторых прочих (мало уникальных еидов == много повторов, + есть индекс по (empid,id)), пока оптимайзинга дистинкт-он-а в самом пж не реализовано, быстрее будет что-то из разряда

Код: sql
1.
2.
3.
4.
5.
6.
7.
select tr.* from empl_table et -- быстрый перебор уникальных еид 
,lateral
        (SELECT * FROM temp tr
             WHERE tr.empid = et.employeeId 
             ORDER BY tr.id DESC LIMIT 1) tr
WHERE tr.type = 1
 
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844146
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
Я так понял записи с type=2, с теми же employeeID, где последний type=1 тоже надо вывести
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844149
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,
Спасибо, не знал о такой реализации DISTINCT.
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844158
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

в вашем примере если у одного employeeID будет 2 записи с type=1 тогда они обе выведутся.
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844163
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TrogloditMaxim Boguk,
Я так понял записи с type=2, с теми же employeeID, где последний type=1 тоже надо вывести
о, похоже вы тщательнее прочитали условие
тогда довольно в широком диапазоне окна хороши


но можно отмодифачить seek -- а именно { ключ+лейтерал запхать в exists} ,для случаев, когда уникальных еидов будет достаточно много (вернее когда конец цепочки еида на тип=1 -- редкость в данных) , и нестед лупы по редкой выборке будут быстрее , чем полный скан таблицы. хотя наверное индекс можно прикрутить с тайпом в конце и емп_ид в начале -- навскидку. не смотрел
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844165
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trogloditqwwq,

в вашем примере если у одного employeeID будет 2 записи с type=1 тогда они обе выведутся.

в каком из ?
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844179
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
Код: sql
1.
2.
3.
4.
5.
6.
select tr.* from empl_table et -- быстрый перебор уникальных еид 
,lateral
        (SELECT * FROM temp tr
             WHERE tr.empid = et.employeeId 
             ORDER BY tr.id DESC LIMIT 1) tr
WHERE tr.type = 1


если будет
1 01.01 1 1
2 02.01 2 1
3 03.01 1 1

Ваш запрос выведет эти записи 1 и 3.
Maxim Boguk считает что должна выводится только последняя, т.е. 3 в моем примере
Я, что все.
У вас результат вернет 1 и 3, если я не ошибаюсь
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844185
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trogloditqwwq,
Код: sql
1.
2.
3.
4.
5.
6.
select tr.* from empl_table et -- быстрый перебор уникальных еид 
,lateral
        (SELECT * FROM temp tr
             WHERE tr.empid = et.employeeId 
             ORDER BY tr.id DESC LIMIT 1) tr
WHERE tr.type = 1


если будет
1 01.01 1 1
2 02.01 2 1
3 03.01 1 1

Ваш запрос выведет эти записи 1 и 3.
Maxim Boguk считает что должна выводится только последняя, т.е. 3 в моем примере
Я, что все.
У вас результат вернет 1 и 3, если я не ошибаюсь

Это к вопросу о том что к таким задачам надо требуемый результат указывать (а не только входные данные).
Или ОЧЕНЬ аккуратно требуемый результат описывать.
А автор вопроса этого не сделал (как обычно на этом форуме впрочем).
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844201
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trogloditqwwq,
Код: sql
1.
2.
3.
4.
5.
6.
select tr.* from empl_table et -- быстрый перебор уникальных еид 
,lateral
        (SELECT * FROM temp tr
             WHERE tr.empid = et.employeeId 
             ORDER BY tr.id DESC LIMIT 1) tr
WHERE tr.type = 1


если будет
1 01.01 1 1
2 02.01 2 1
3 03.01 1 1

Ваш запрос выведет эти записи 1 и 3.
Maxim Boguk считает что должна выводится только последняя, т.е. 3 в моем примере
Я, что все.
У вас результат вернет 1 и 3 , если я не ошибаюсь

я делаю то же , что и МБ

ЧЯДНТ?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with _dt (ID,DT,type,empid) AS ( values --данные

(1, date'2019-01-01', 1, 1)
,(2, date'2019-01-02', 1, 1)
,(3, date'2019-01-03', 1, 1)
)
,empl_table (employeeID) As (values (1),(2),(3)) -- справочник еид

select tr.* from empl_table et -- быстрый перебор уникальных еид 
,lateral
	(SELECT * FROM _dt tr
		WHERE tr.empid = et.employeeId 
		ORDER BY tr.id DESC LIMIT 1) tr
WHERE tr.type = 1
;
-- 3;"2019-01-03";1;1

...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844256
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Я не правильно понял ваш запрос с 2-мя таблицами, когда у автора была одна.
Ваш запрос работает.
Но очень изящный и на мой взгляд более производительным будет пример Maxim Boguk.
У вас нет таблицы empl_table, т.е. ее еще надо сделать из _dt(а это по сути тот же distinct, плюс к этом дополнительный join) , и кстати откуда у вас взялись id 2 и 3, когда в вашем примере только empid=1.
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844267
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Trogloditqwwq,

Я не правильно понял ваш запрос с 2-мя таблицами, когда у автора была одна.
Ваш запрос работает.
Но очень изящный и на мой взгляд более производительным будет пример Maxim Boguk.
У вас нет таблицы empl_table, т.е. ее еще надо сделать из _dt(а это по сути тот же distinct, плюс к этом дополнительный join) , и кстати откуда у вас взялись id 2 и 3, когда в вашем примере только empid=1.

речь не про изящество кляузы а про оптимальность выполнения.
слово "дистинкт он" в пж есть, а вот луз-индекскан для него не реализован. что печально.

вместо "второй таблицы" в случае отсутствия таковой в бд (что редкость) -- реализуем упомянутый "LOOSE indexscan" ручками.

как -- порыскать тут (или в гугле) поиском и додумать.

если же табла неиндексирована, то дистинкт он -- самое оно.
...
Рейтинг: 0 / 0
запрос на выборку по максимальной дате
    #39844354
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

Я понял о чем вы. До этого видел доклад Maxim Boguk, просто у него через CTE было в примерах я не сразу понял о чем речь.
Я вообще думаю такие вещи нужно решать не реляционными способами, а потоковыми.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос на выборку по максимальной дате
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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