查询将为每天输入第一行

时间:2011-05-20 17:55:12

标签: sql sql-server sql-server-2005 tsql sql-server-2008

我有一个带有自动增量编号字段的表格为“否”,日期/时间标记为“Entry_Date”,以及X,Y,Z字段。每隔几分钟,我的程序会插入一个包含当前日期/时间的新行。

我需要一个查询,它会为过去365天的每一天输入第一行(或者我想要使用的任何值)。请帮忙......

2 个答案:

答案 0 :(得分:2)

我使用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

答案 1 :(得分:0)

有几种方法可以做到这一点:

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值,则这些查询将同时返回两行。