Отчет - SQL группировка по номеру недели и году - PullRequest
0 голосов
/ 22 января 2020

У меня есть таблица temperatures со столбцами mac_address varchar (255), tm datetime, temperature float. Я хотел бы создать отчет с 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 строки. В большинстве случаев будет только один ряд.

Ответы [ 2 ]

1 голос
/ 27 января 2020

Из того, что я понимаю из вашего вопроса, вы хотите выполнить динамический поиск по 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 был включен в результаты, просто добавьте в разделы Выбор и Группировка по.

Вот SQL скрипка с тестовой настройкой.

1 голос
/ 22 января 2020

Для набора данных для построения параметра год вы можете использовать что-то вроде этого, что даст вам 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

Редактировать : удалить tm из SELECT и GROUP BY

select max(temperature), mac_address
from temperatures
where mac_address = @mac_address 
  and week_number = @week_number 
  and year = @year
group by mac_address
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...