繁体   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