[英]Report - SQL group by week number and year
我有一个包含mac_address
varchar(255), tm
datetime, temperature
float 列的表temperatures
。 我想创建一个包含 3 个参数的报告: mac_address
、 week_number
和year
。
该报告应显示maximum temperature
在一定mac_address
在某些week_number
(01,... 50,...),在某些year
。 某些week_number
和year
可能有超过 1 行...
数据集的 SQL 查询可能类似于
select max(temperature), mac_address, tm
from temperatures
group by mac_address
having mac_address = @mac_address and week_number = @week_number and year = @year
您知道如何正确构造查询吗? 也许我还需要 3 个数据集。 对于@mac_address 参数,这很容易。 我会
select distinct mac_address from temperatures
但是我怎么能用@week_number 和@year 参数来做呢? 是手动添加下拉列表值的唯一选项吗?
可能的结果可能是:当用户从参数mac_address
001、 week_number
47 和year
2019 中选择时
max_temperature | tm
27.8 t1
27.8 t2
27.8 t3
现在它返回 3 行。 大多数时候只会有一行。
对于构建年份参数的数据集,您可以使用类似这样的方法,这将使您获得 10 年。 您可以根据需要进行扩展:
;WITH years AS (
SELECT YEAR(DATEADD(YY,-5,GETDATE())) AS yr
UNION ALL
SELECT yr + 1
FROM years
WHERE yr < YEAR(DATEADD(YY,5,GETDATE()))
)
SELECT *
FROM years
对于周参数,您可以对它们进行硬编码或使用以下内容:
;WITH weeks AS (
SELECT 1 AS wk
UNION ALL
SELECT wk + 1
FROM weeks
WHERE wk < 52
)
SELECT *
FROM weeks
在您的主 SQL 数据集中,您可能希望使用以下内容:
select max(temperature), mac_address, tm
from temperatures
where mac_address = @mac_address
and week_number = @week_number
and year = @year
group by mac_address, tm
编辑:从SELECT
和GROUP BY
删除tm
select max(temperature), mac_address
from temperatures
where mac_address = @mac_address
and week_number = @week_number
and year = @year
group by mac_address
根据我从您的问题中了解到的,您希望按weeknumber
、 mac_address
和year
动态搜索,返回该范围内匹配的每一天的最高温度。 像下面这样的查询应该做你所追求的。
declare @macaddress varchar(255) = '2', @WeekNumber int = 36, @year int = 2019
Select
Date = tm,
Temperature = max(temperature)
from
Temps t
where
year(tm)=@year
and mac_address=@macaddress
and datepart(week,tm) = @WeekNumber
group by
tm
如果您希望结果中包含 mac_address,只需添加到 Select 和 Group By 部分即可。
这是带有测试设置的SQL 小提琴。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.