Получить максимальное время в столбце datetime для определенных часов в день? - PullRequest
1 голос
/ 08 октября 2019

У меня есть столбец с именем SnapshotDate со снимком каждые 30 минут на два года назад (пример этого столбца в ссылке ниже).

Как получить максимальную запись в минутах (или секундах) вSnapshotDate для того, когда Час равен 6 или 15?

Примечание: 30-минутный интервал менялся так много раз, что я не могу специально использовать 06:50, например, или 15:50 в WHERE

В настоящее время у меня есть WHERE DATEPART(hh,ys.SnapshotDate) IN (6,15), чтобы получить только SnapshotDate записей в часах 0600 или 1500, но как мне извлечь максимальное время в этих записях, чтобы в определенный день я толькополучить два результата: один в 06:50, а другой в 15: 50

Screenshot of the SnapshotDate column

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Я бы порекомендовал row_number() для этого, как:

select t.*
from (select t.*,
             row_number() over (partition by convert(date, snapshotdate), datepart(hour, snapshotdate)
                                order by snapshotdate desc
                               ) as seqnum
      from t
      where datepart(hour, snapshot) in (6, 15)
     ) t
where seqnum = 1;

К сожалению, SQL Server не имеет никакой функции date_trunc(). Но вы можете конвертировать в дату и использовать час.

0 голосов
/ 08 октября 2019

Вот запрос на основе оконной функции, который для каждого дня в вашем наборе данных даст вам две записи: последнюю запись в 6-часовом интервале и последнюю запись в 15-часовом интервале:

SELECT *
FROM (
    SELECT 
        t.*,
        ROW_NUMBER() OVER(
            PARTITION BY YEAR(SnapshotDate), MONTH(SnapshotDate), DAY(SnapshotDate), DATEPART(hh, SnapshotDate) 
            ORDER BY SnapshotDate DESC
        ) rn
    FROM mytable
    WHERE DATEPART(hh, SnapshotDate) IN (6, 15)
) WHERE rn = 1

Если вы просто хотите получить запись с наибольшим временем в 6-часовом интервале и запись с наибольшим временем в 15-часовом интервале по всей таблице (а не ежедневно), то вы можете просто удалить предложение PARTITION:

SELECT *
FROM (
    SELECT 
        t.*,
        ROW_NUMBER() OVER(ORDER BY SnapshotDate DESC) rn
    FROM mytable
    WHERE DATEPART(hh, SnapshotDate) IN (6, 15)
) WHERE rn = 1
...