繁体   English   中英

报告 - 按周数和年份分组的 SQL

[英]Report - SQL group by week number and year

我有一个包含mac_address varchar(255), tm datetime, temperature float 列的表temperatures 我想创建一个包含 3 个参数的报告: mac_addressweek_numberyear

该报告应显示maximum temperature在一定mac_address在某些week_number (01,... 50,...),在某些year 某些week_numberyear可能有超过 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

编辑:从SELECTGROUP 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

根据我从您的问题中了解到的,您希望按weeknumbermac_addressyear动态搜索,返回该范围内匹配的每一天的最高温度。 像下面这样的查询应该做你所追求的。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM