Запрос, который даст первую строку, введенную для каждого дня - PullRequest
2 голосов
/ 20 мая 2011

У меня есть таблица с полем чисел с автоинкрементом как "Нет", отметкой даты / времени как "Entry_Date" и полями X, Y, Z.Каждые несколько минут Моя программа вставляет новую строку с текущей датой / временем.

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

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Я бы использовал ROW_NUMBER и разделил по дате. Красиво и просто: (обратите внимание, это 2008 год, для использования DATE)

CREATE TABLE #TestDatePartition
(
    ID int IDENTITY(1,1),
    EntryTime datetime
)

INSERT INTO #TestDatePartition(EntryTime)
SELECT GETDATE() UNION ALL
SELECT DATEADD(HH, 1, GETDATE()) UNION ALL
SELECT DATEADD(HH, 2, GETDATE()) UNION ALL
SELECT DATEADD(DAY, 1, GETDATE()) UNION ALL
SELECT DATEADD(HH, 26, GETDATE()) UNION ALL
SELECT DATEADD(DAY, 6, GETDATE())

SELECT ID, EntryTime FROM (
SELECT ID, EntryTime, ROW_NUMBER() OVER (PARTITION BY CAST(EntryTime AS DATE) ORDER BY EntryTime ASC) AS RowNumber FROM #TestDatePartition
) SubTable
WHERE SubTable.RowNumber = 1
0 голосов
/ 20 мая 2011

Есть несколько способов сделать это:

SELECT
    my_id,
    entry_date,
    x,
    y,
    z
FROM
    (
        SELECT
            DATEPART(DAYOFYEAR, entry_date) AS day_of_year,
            MIN(entry_date) AS first_of_day
        FROM
            My_Table
        WHERE
            entry_date > DATEADD(dy, -1 * @num_days_back, GETDATE())
        GROUP BY
            DATEPART(DAYOFYEAR, entry_date)
    ) SQ
INNER JOIN My_Table MT ON
    MT.entry_date > DATEADD(dy, -1 * @num_days_back, GETDATE()) AND
    MT.entry_date = SQ.first_of_day

Или, альтернативно

SELECT
    my_id,
    entry_date,
    x,
    y,
    z
FROM
    My_Table MT1
LEFT OUTER JOIN My_Table MT2 ON
    MT2.entry_date > DATEADD(dy, -1 * @num_days_back, GETDATE()) AND
    DATEPART(DAYOFYEAR, MT2.entry_date) = DATEPART(DAYOFYEAR, MT1.entry_date) AND
    MT2.entry_date < MT1.entry_date
WHERE
    MT1.entry_date > DATEADD(dy, -1 * @num_days_back, GETDATE()) AND
    MT2.my_id IS NULL

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

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