Как получить уникальные записи с помощью группы по? - PullRequest
0 голосов
/ 12 марта 2020

Факт:

У меня есть таблица, которая выглядит ниже, и я хочу запрос максимальных (ts) записей для каждого индекса.

index,ts,pearson,close
1,2018-01-01 00:00:00.0,-0.0732723,1.19985
1,2018-01-01 00:01:00.0,-0.0324333,1.18989
1,2018-01-01 00:02:00.0,-0.0737444,1.17985
2,2018-01-01 00:01:00.0,-0.0832523,1.18955
2,2018-01-01 00:02:00.0,-0.0624323,1.16919
2,2018-01-01 00:03:00.0,-0.0237494,1.17789

Ожидается:

index,ts,pearson,close
1,2018-01-01 00:02:00.0,-0.0737444,1.17985
2,2018-01-01 00:03:00.0,-0.0237494,1.17789

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Один канонический способ сделать это использует ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY "index" ORDER BY ts DESC) rn
    FROM yourTable
)

SELECT "index", ts, pearson, close
FROM cte
WHERE rn = 1;

В качестве примечания, пожалуйста, не называйте ваши столбцы index, который является зарезервированным ключевым словом в большинстве разновидностей SQL. Я избежал index выше, используя двойные кавычки, хотя вам, возможно, придется бежать другим путем, в зависимости от вашей реальной базы данных.

0 голосов
/ 12 марта 2020

Если вам нужна последняя запись по времени для каждой строки, то разумным подходом является:

select t.*
from t
where t.ts = (select max(t2.ts) from t t2 where t2.index = t.index);

В частности, для этого можно использовать индекс (index, ts).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...