SQL команда для помещения записей даты и времени в сегменты - PullRequest
0 голосов
/ 10 марта 2020

У меня есть структура таблицы следующим образом:

timestamp
2020-03-10 04:05:44.000000
2020-03-10 04:05:44.000000
2020-03-10 04:05:44.000000
2020-03-10 04:05:44.000000
2020-03-10 07:07:44.000000
2020-03-10 07:07:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000
2020-03-10 13:17:44.000000

Каждый день есть только три метки времени (время может отличаться, но оно всегда три). Мне нужен еще один столбец, в котором указано, какая временная метка была первой, второй и третьей, т. Е. Выводит следующие данные:

timestamp                   timestamp_order
2020-03-10 04:05:44.000000  1
2020-03-10 04:05:44.000000  1
2020-03-10 04:05:44.000000  1
2020-03-10 04:05:44.000000  1
2020-03-10 07:07:44.000000  2
2020-03-10 07:07:44.000000  2
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3
2020-03-10 13:17:44.000000  3

Количество записей может различаться в трех сегментах. Я уже попробовал несколько функций RANK () или NTILE (), но не смог получить правильный вывод, потому что он либо дает мне слишком большие числа (ранжирование дает мне 1,1,1,1,5,5, ...) или принимает ведра одинакового размера.

Спасибо!

Ответы [ 3 ]

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

Не уверен, что он работает для всех дБмс (работает, по крайней мере, в Postgres), но вы можете попробовать:

SELECT 
    timestamp, 
    DENSE_RANK() OVER(PATITION BY date_trunc('day', timestamp) 
                       ORDER BY timestamp) as timestamp_order
FROM table

date_trunc извлекает день из вашей временной метки и ранг дает вам

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

Вам нужно DENSE_RANK с разделом:

SELECT timestamp
     , DENSE_RANK() OVER(PARTITION BY CAST(timestamp AS DATE) ORDER BY timestamp) AS timestamp_order
FROM t
0 голосов
/ 10 марта 2020

Просто используйте функцию DENSE RANK, которая дает вам рейтинг внутри вашего заказанного раздела.

SELECT timestamp, 
       DENSE_RANK( ) OVER( ORDER BY timestamp ASC ) timestamp_order
FROM #TABLE_Name;
...