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