Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Как сделать такую выборку одним запросом  [new]
iskatelsql
Member

Откуда:
Сообщений: 785
Есть пара простых таблиц - таблица объектов и таблица измерений

+ Подробности таблиц
/* 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';

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

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

А как добраться до второй по счету даты?
20 апр 19, 17:39    [21867841]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую выборку одним запросом  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1314
iskatelsql,

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
20 апр 19, 18:33    [21867861]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую выборку одним запросом  [new]
iskatelsql
Member

Откуда:
Сообщений: 785
VSVLAD,

Спасибо, если добавить
order by date
работает как надо

ЗЫ. выражения over и partition первый раз вижу. Надо загуглить. Они есть у MySQL? я раньше только с ней дело имел.
20 апр 19, 18:43    [21867865]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую выборку одним запросом  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1314
iskatelsql
Они есть у MySQL?


Форум как-бы по SQLite...
20 апр 19, 18:53    [21867875]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую выборку одним запросом  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1314
Не так прочитал вопрос. Да, они есть во всех современных СУБД MySQL, PostgreSQL, MSSQL, Oracle.
А куда "order by date" вы хотите добавить? В предложении over указывается как сортировать
20 апр 19, 18:55    [21867876]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую выборку одним запросом  [new]
iskatelsql
Member

Откуда:
Сообщений: 785
VSVLAD,

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

Картинка с другого сайта.
20 апр 19, 19:00    [21867881]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать такую выборку одним запросом  [new]
iskatelsql
Member

Откуда:
Сообщений: 785
VSVLAD,

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

ЗЫ. а MySQL я мучал в 2012, тогда оконных там еще небыло. Судя по гуглу они только в 8 версии появились, которая только полгода назад релизнулась.
20 апр 19, 20:01    [21867898]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить