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

Имеется:
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
31.01.2015, 12:20
    #38868360
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос group by и Firebird
InterruptionВ MySQL, как мне кажетсякажется.

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

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


Ivan_Pisarevskyлибо обернуть агрегирующей функцией.
а не могли бы Вы написать пример, а то честно скажу не силён я в этом :)
...
Рейтинг: 0 / 0
31.01.2015, 12:32
    #38868364
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос group by и Firebird
Interruptionработало как нужно.А какой дем_ид подставлялся? первый попавшийся?
Interruptionа не могли бы Вы написать примеркокой дев_ид тебе нужен?
...
Рейтинг: 0 / 0
31.01.2015, 12:50
    #38868366
Interruption
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос group by и Firebird
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
31.01.2015, 12:59
    #38868369
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос group by и Firebird
Например так:
Код: 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
31.01.2015, 13:05
    #38868370
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос group by и Firebird
Interruptionвот так должен отработать правильный запрос
Как должен отработать запрос, если за один день было в одном боксе изменено два девайса?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.01.2015, 13:19
    #38868375
Interruption
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос group by и Firebird
Dimitry Sibiryakov, спасибо большое, именно то что нужно.

Dimitry SibiryakovКак должен отработать запрос, если за один день было в одном боксе изменено два девайса?
В любом случае нужен только последний девайс.
Так как поле у DEV_CHANGEDATE типа TIMESTAMP я думаю должно всё правильно отработать (ведь кроме даты будет ещё и время).
...
Рейтинг: 0 / 0
31.01.2015, 13:49
    #38868384
Interruption
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос group by и Firebird
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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запрос group by и Firebird / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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