[英]Get data from the last day of the month without the use of loops or variables
我寫了一個查詢,應該選擇一年中每個月的最后一條記錄。 我想基於這個選擇創建一個視圖,我可以稍后在我的項目中運行,但不幸的是我不能在視圖命令中使用任何 while 循環或變量。 有沒有辦法選擇所有這些記錄 - 我可以在以后使用的視圖中選擇一個月的最后幾天?
我想要的視圖效果:
我試圖在視圖中實現的查詢:
DECLARE @var_day01 DATETIME;
DECLARE @month int;
SET @month = 1;
DROP TABLE IF EXISTS #TempTable2;
CREATE TABLE #TempTable2 (ID int, date datetime, INP2D float, INP3D float, ID_device varchar(max));
WHILE @month < 13
BEGIN
SELECT @var_day01 = CONVERT(nvarchar, date) FROM (SELECT TOP 1 * FROM data
WHERE DATEPART(MINUTE, CONVERT(nvarchar, date)) = '59'
AND
MONTH(CONVERT(nvarchar, date)) = (CONVERT(nvarchar, @month))
ORDER BY date DESC
) results
ORDER BY date DESC;
INSERT INTO #TempTable2 (ID, date, INP2D,INP3D,ID_device)
SELECT * FROM data
WHERE DATEPART(MINUTE, CONVERT(nvarchar, date)) = '59'
AND
MONTH(CONVERT(nvarchar, date)) = (CONVERT(nvarchar, @month))
AND
DAY(CONVERT(nvarchar, date)) = CONVERT(datetime, DATEPART(DAY, @var_day01))
ORDER BY date DESC
PRINT @var_day01
SET @month = @month +1;
END
SELECT * FROM #TempTable2;
如果您實際上只是在每個月的最近一行之后,則無需使用while
循環來實現此目的。 您只需要確定每個月的max
date
值,然后為這些行過濾源數據。
實現此目的的一種方法是通過row_number
窗口函數:
declare @t table(id int,dt datetime2);
insert into @t values(1,getdate()-40),(2,getdate()-35),(3,getdate()-25),(4,getdate()-10),(5,getdate());
select id
,id_device
,dt
from(select id
,id_device
,dt
,row_number() over (partition by id_device, year(dt), month(dt) order by dt desc) as rn
from @t
) as d
where rn = 1;
你可以簡單的添加where
你select
的語句,在where
子句你有一天會加入到date
字段,然后select
該day
從所得的date
。 如果結果date
為1
則只有您會select
該記錄
您查詢的where
子句將是: Where Day(DATEADD(d,1,[date])) = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.