Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как сделать такую выборку одним запросом / 7 сообщений из 7, страница 1 из 1
20.04.2019, 17:39
    #39804274
iskatelsql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такую выборку одним запросом
Есть пара простых таблиц - таблица объектов и таблица измерений

Подробности таблиц
Код: 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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
/* Disable foreign keys */
PRAGMA foreign_keys = 'off';

/* Begin transaction */
BEGIN;

/* Database properties */
PRAGMA auto_vacuum = 0;
PRAGMA encoding = 'UTF-8';
PRAGMA page_size = 4096;

/* Drop table [obj] */
DROP TABLE IF EXISTS [main].[obj];

/* Table structure [obj] */
CREATE TABLE [main].[obj](
  [id] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [name] TEXT);

/* Drop table [measurement] */
DROP TABLE IF EXISTS [main].[measurement];

/* Table structure [measurement] */
CREATE TABLE [main].[measurement](
  [id_obj] INTEGER REFERENCES [obj]([id]), 
  [date] DATE);

/* Table data [obj] Record count: 3 */
INSERT INTO [obj]([rowid], [id], [name]) VALUES(1, 1, 'a');
INSERT INTO [obj]([rowid], [id], [name]) VALUES(2, 2, 'b');
INSERT INTO [obj]([rowid], [id], [name]) VALUES(3, 3, 'c');

/* Table data [measurement] Record count: 9 */
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(1, 1, '2019-04-01');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(2, 2, '2019-04-01');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(3, 3, '2019-04-01');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(4, 1, '2019-04-05');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(5, 1, '2019-04-03');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(6, 2, '2019-04-07');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(7, 2, '2019-04-02');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(8, 3, '2019-04-10');
INSERT INTO [measurement]([rowid], [id_obj], [date]) VALUES(9, 3, '2019-04-04');

/* Commit transaction */
COMMIT;

/* Enable foreign keys */
PRAGMA foreign_keys = 'on';


Нужно выбрать наименования объектов, отсортированные по дате, но по дате второго измерения

Было бы по дате первого - прокатило бы так:
Код: sql
1.
2.
3.
4.
5.
SELECT obj.name
FROM   obj
       INNER JOIN measurement ON obj.id = measurement.id_obj
GROUP  BY obj.name
ORDER  BY MIN (measurement.date);


А как добраться до второй по счету даты?
...
Рейтинг: 0 / 0
20.04.2019, 18:33
    #39804286
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такую выборку одним запросом
iskatelsql,

Код: sql
1.
2.
3.
4.
5.
select name, date 
from (    select o.name, m.date, row_number() over(partition by m.id_obj order by m.date asc) rownum_date
          from obj o
          inner join measurement m on m.id_obj = o.id
) where rownum_date = 2
...
Рейтинг: 0 / 0
20.04.2019, 18:43
    #39804288
iskatelsql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такую выборку одним запросом
VSVLAD,

Спасибо, если добавить
Код: sql
1.
order by date

работает как надо

ЗЫ. выражения over и partition первый раз вижу. Надо загуглить. Они есть у MySQL? я раньше только с ней дело имел.
...
Рейтинг: 0 / 0
20.04.2019, 18:53
    #39804291
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такую выборку одним запросом
iskatelsqlОни есть у MySQL?

Форум как-бы по SQLite...
...
Рейтинг: 0 / 0
20.04.2019, 18:55
    #39804292
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такую выборку одним запросом
Не так прочитал вопрос. Да, они есть во всех современных СУБД MySQL, PostgreSQL, MSSQL, Oracle.
А куда "order by date" вы хотите добавить? В предложении over указывается как сортировать
...
Рейтинг: 0 / 0
20.04.2019, 19:00
    #39804295
iskatelsql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такую выборку одним запросом
VSVLAD,

Если не добавить order by date в самый конец запроса, то выводится так:

...
Рейтинг: 0 / 0
20.04.2019, 20:01
    #39804307
iskatelsql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать такую выборку одним запросом
VSVLAD,

Спасибо еще раз. Оконные функции офигительная оказывается штука, я пол программы через них перепишу. Ощущения такие, как в игре нашел навороченное оружие с большими возможностями


ЗЫ. а MySQL я мучал в 2012, тогда оконных там еще небыло. Судя по гуглу они только в 8 версии появились, которая только полгода назад релизнулась.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как сделать такую выборку одним запросом / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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