表查询中的存储过程显示每日数据

问题描述 投票:0回答:1

我创建了用户在 SOAP (asmx) Web 服务中作为存储过程发送请求的结构。要求用户提供以下值:

Device id (string)
Start date (datetime)
End date (datetime)

此处输入的日期中的每一天都会返回一行。例如,如果您输入 1 月 1 日到 1 月 5 日,则总共 5 行将返回该设备每一天的数据。可以在此处输入时间,因此一天的结束时间始终为 23:59:59。特别要指出的是,具体数据如1月1日10:00到1月1日13:00也可以输入。

我将这个日期以及设备在这一天所做的事情以数字形式记录在表格中,没有问题,但我在使用 select 来显示它时遇到了问题。

添加记录并属于设备的示例表;

由于相同的查询进行了多次,这些也被记录下来,所以它显示了这一点。我的目标是以不重复的方式返回与记录日期之间的日差一样多的记录。

我为此使用的查询是这样的:

SELECT TOP (@dayDiff) DISTINCT 
    DEVICE, VALUE, DATE, DATE1 
FROM
    tableName 
WHERE 
    DEVICE = @DeviceId 
    AND DATE1 >= @Date1 
    AND DATE2 <= @Date1 
    AND ABS(VALUE) >= 0 
ORDER BY 
    [DATE1] ASC

我称之为存储过程;

EXEC [dbo].[exampleProcedure] 'ABC','2023-12-25 12:00:00','2024-01-04 15:00:00'

此查询结果显示;

我想要通过存储过程得到这个结果,所以每天都会按行显示一个结果

sql sql-server stored-procedures datatable
1个回答
0
投票

日期维度是一个非常方便利用的东西(数据仓库)。

但是,对于一般用途,有一种快速而肮脏的方法可以通过递归 ctde 动态创建虚拟“日期维度”:

declare @start datetime, @end datetime
set @start = '20240101'
set @end = '20240105'
;
with daterange as 
(
   select @start 'Date', 1 'Record'
   union all
   select dateadd(day,1,Date), Record + 1
   from daterange
   where dateadd(day,1,@start) <= @end
   and Record < datediff(day, @start, @end) + 1
)
select *
from daterange

然后,您可以加入日期范围作为后续查询的一部分,并按日期等进行分组。

© www.soinside.com 2019 - 2024. All rights reserved.