Привет, у меня есть база данных погоды в SQL Server 2008, которая заполнена данными наблюдений за погодой, которые проводятся каждые 20 минут. Я хочу получать записи погоды за каждый час, а не каждые 20 минут, как мне отфильтровать некоторые результаты, чтобы в результатах было только первое наблюдение за каждый час.

Примере:

7:00:00
7:20:00
7:40:00
8:00:00

Пожеланная выходная мощность

7:00:00 
8:00:00
0
GarrettH 29 Дек 2015 в 02:28

5 ответов

Лучший ответ

Чтобы получить в точности (за вычетом того факта, что это INT вместо TIME; ничего сложно исправить) то, что вы указали как желаемый результат,

SELECT DISTINCT DATEPART(HOUR, TimeStamp)
FROM Observations

Вы также можете добавить CAST(TimeStamp AS DATE), если хотите.


Предполагая, что вам также нужны данные, это немного зависит от того, что вы описали, простое решение - просто сказать:

SELECT *
FROM Observations
WHERE DATEPART(MINUTE, TimeStamp) = 0

Однако это не удается, если у вас отсутствуют данные, что довольно часто.


Если у вас есть несколько часов, когда вам нужны данные, но нет строки в: 00, вы можете сделать что-то вроде этого:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CAST(TimeStamp AS DATE), DATEPART(HOUR, TimeStamp) ORDER BY TimeStamp)
    FROM Observations
)

SELECT *
FROM cte
WHERE n = 1

Это займет первое место для любой комбинации даты и часа.

Конечно, вы по-прежнему пропускаете все, о чем не было данных за целый час. Для этого потребуется таблица чисел, если вы даже хотите вернуть эти экземпляры.

1
Matthew Haugen 28 Дек 2015 в 23:48

Чтобы отфильтровать результат для каждого целого часа, вы можете установить в предложении where проверку на 00 минут, так как каждый полный час - это HH: 00:00.

Чтобы получить минутную часть из отметки времени, вы можете использовать функцию DATEPART.

SELECT * 
FROM YOURTABLENAME
WHERE DATEPART(MINUTE, YOURDATEFIELDNAME) = 0

Дополнительную информацию о функции datepart можно найти здесь: http://www.w3schools.com/sql/func_datepart .asp

0
NKD 28 Дек 2015 в 23:51

Использовать как фильтр:

... where DATEPART(MINUTE, DateColumn) = 0
0
Didier68 28 Дек 2015 в 23:44

Что вам нужно, так это GROUP BY желаемый период времени, например, дату и часы. Затем вы получите значение MIN таймфрейма. Поскольку вы не указали, какие столбцы вы используете, это самая общая вещь, которую я могу дать.

0
stb 28 Дек 2015 в 23:41

Вы можете использовать формулу, подобную следующей, чтобы получить ближайший час к моменту времени (в данном случае это GETUTCDATE()).

SELECT  DATEADD(MINUTE, DATEDIFF(MINUTE, 0, GETUTCDATE()) / 60 * 60, 0)

Затем вы можете использовать эту формулу в предложении WHERE вашего SQL-запроса, чтобы получить нужные данные.

0
Just a learner 28 Дек 2015 в 23:38