powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос group by и Firebird
9 сообщений из 9, страница 1 из 1
Запрос group by и Firebird
    #38868356
Interruption
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Имеется:
Firebird 2.5.2.26443

Таблица
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE "test_table" (
    DEV_ID          VARCHAR(15) NOT NULL,
    DEV_CHANGEDATE  TIMESTAMP NOT NULL,
    ROOM_ID         SMALLINT NOT NULL,
    BOX_ID          SMALLINT NOT NULL);



с данными
Код: plsql
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('516272832466368', '24-OCT-2014 00:00:00', 3, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('197605901766162', '17-APR-2014 00:00:00', 1, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('407656340378994', '7-JUL-2014 00:00:00', 3, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('647989364478623', '25-FEB-2014 00:00:00', 1, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('457677730956079', '26-DEC-2014 00:00:00', 1, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('673181452546396', '30-JAN-2014 00:00:00', 3, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('020725874859675', '1-NOV-2014 00:00:00', 1, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('325772449509296', '23-FEB-2014 00:00:00', 3, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('046562649759634', '27-SEP-2014 00:00:00', 3, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('920134765818886', '22-SEP-2014 00:00:00', 2, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('179343592288822', '8-NOV-2014 00:00:00', 1, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('777912455704449', '7-MAY-2014 00:00:00', 2, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('184052339872799', '28-APR-2014 00:00:00', 3, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('792404057856503', '10-DEC-2014 00:00:00', 1, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('861596841237969', '14-DEC-2014 00:00:00', 1, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('979594889697591', '18-SEP-2014 00:00:00', 2, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('005642400208966', '25-SEP-2014 00:00:00', 2, 2);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('238490971630203', '17-MAY-2014 00:00:00', 2, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('537580375430753', '25-FEB-2014 00:00:00', 2, 1);
INSERT INTO "test_table" (DEV_ID,DEV_CHANGEDATE,ROOM_ID,BOX_ID)
       VALUES ('227897844254307', '9-MAY-2014 00:00:00', 3, 1);

COMMIT;



Из этой таблицы нужно выбрать самые последние по дате (DEV_CHANGEDATE) записи для сочетания ROOM_ID, BOX_ID и вывести их в формате | ROOM_ID | BOX_ID | DEV_ID | DEV_CHANGEDATE |

результат должен выглядеть вот как то так
ROOM_IDBOX_IDDEV_IDDEV_CHANGEDATE1145767773095607926.12.2014 00:001286159684123796914.12.2014 00:002192013476581888622.09.2014 00:002200564240020896625.09.2014 00:003122789784425430709.05.2014 00:003251627283246636824.10.2014 00:00


В MySQL, как мне кажется, этот вопрос решился бы с помощью такого запроса
Код: plsql
1.
SELECT ROOM_ID, BOX_ID, DEV_ID, MAX(DEV_CHANGEDATE) FROM test_table GROUP BY ROOM_ID, BOX_ID


но тут такое не проходит ...

Поэтому прошу помощи, подскажите как это реализовать в Firebird ?
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868360
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
InterruptionВ MySQL, как мне кажетсякажется.

DEV_ID нало либо включить в группировку, либо обернуть агрегирующей функцией.
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868363
Interruption
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevskyкажется.
Я проверял и всё вроде работало как нужно.

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


Ivan_Pisarevskyлибо обернуть агрегирующей функцией.
а не могли бы Вы написать пример, а то честно скажу не силён я в этом :)
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868364
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interruptionработало как нужно.А какой дем_ид подставлялся? первый попавшийся?
Interruptionа не могли бы Вы написать примеркокой дев_ид тебе нужен?
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868366
Interruption
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_PisarevskyА какой дем_ид подставлялся? первый попавшийся?
Да, Вы правы ... работает не правильно, DEV_ID какой попало ...

Ivan_Pisarevskyкокой дев_ид тебе нужен?
Нужно чтоб DEV_ID был из той же строки что и дата.

вот так должен отработать правильный запрос:
1145767773095607926.12.2014 00:001286159684123796914.12.2014 00:002192013476581888622.09.2014 00:002200564240020896625.09.2014 00:003122789784425430709.05.2014 00:003251627283246636824.10.2014 00:00
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868369
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например так:
Код: sql
1.
2.
3.
SELECT ROOM_ID, BOX_ID, DEV_ID, DEV_CHANGEDATE FROM test_table t1
where not exists (SELECT * from test_table t2 where t1.ROOM_ID=t2.ROOM_ID and 
t1.BOX_ID=t2.BOX_ID and t1.DEV_CHANGEDATE<t2.DEV_CHANGEDATE)


или так:
Код: sql
1.
2.
3.
4.
5.
SELECT t1.*, t2.DEV_ID FROM
  (SELECT ROOM_ID, BOX_ID, MAX(DEV_CHANGEDATE) MAX_DATE FROM test_table
   GROUP BY ROOM_ID, BOX_ID) t1
  JOIN test_table t2
    on t1.ROOM_ID=t2.ROOM_ID and t1.BOX_ID=t2.BOX_ID and t1.MAX_DATE=t2.MAX_DATE


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868370
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Interruptionвот так должен отработать правильный запрос
Как должен отработать запрос, если за один день было в одном боксе изменено два девайса?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868375
Interruption
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, спасибо большое, именно то что нужно.

Dimitry SibiryakovКак должен отработать запрос, если за один день было в одном боксе изменено два девайса?
В любом случае нужен только последний девайс.
Так как поле у DEV_CHANGEDATE типа TIMESTAMP я думаю должно всё правильно отработать (ведь кроме даты будет ещё и время).
...
Рейтинг: 0 / 0
Запрос group by и Firebird
    #38868384
Interruption
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
Код: sql
1.
2.
3.
4.
5.
SELECT t1.*, t2.DEV_ID FROM
  (SELECT ROOM_ID, BOX_ID, MAX(DEV_CHANGEDATE) MAX_DATE FROM test_table
   GROUP BY ROOM_ID, BOX_ID) t1
  JOIN test_table t2
    on t1.ROOM_ID=t2.ROOM_ID and t1.BOX_ID=t2.BOX_ID and t1.MAX_DATE=t2.MAX_DATE




кажется в последний запрос вкралась опечатка ...
Код: plaintext
t2.MAX_DATE
должно быть
Код: plaintext
t2.DEV_CHANGEDATE
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос group by и Firebird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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