簡體   English   中英

在不使用循環或變量的情況下獲取本月最后一天的數據

[英]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;

你可以簡單的添加whereselect的語句,在where子句你有一天會加入到date字段,然后selectday從所得的date 如果結果date1則只有您會select該記錄

您查詢的where子句將是: Where Day(DATEADD(d,1,[date])) = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM