powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как сделать такую выборку одним запросом
7 сообщений из 7, страница 1 из 1
Как сделать такую выборку одним запросом
    #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
Как сделать такую выборку одним запросом
    #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
Как сделать такую выборку одним запросом
    #39804288
iskatelsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

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

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

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

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

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

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

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


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


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