我有一个带有自动增量编号字段的表格为“否”,日期/时间标记为“Entry_Date”,以及X,Y,Z字段。每隔几分钟,我的程序会插入一个包含当前日期/时间的新行。
我需要一个查询,它会为过去365天的每一天输入第一行(或者我想要使用的任何值)。请帮忙......
答案 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值,则这些查询将同时返回两行。