Максимальное использование на каждый день для каждой группы - PullRequest
0 голосов
/ 14 января 2020

Каждый час я загружаю данные ЧАСЫ для 6 разных групп (DG). Как получить максимальное значение (использование) для каждой группы за каждый день? Кажется, я не могу сгруппировать его по дате.

Пример данных (показывается 2 часа загрузки, но для каждого дня будет 24)

DG         Usage       UploadDateTime
 ---------  ---------  ----------
 1          100         2012-08-30 10:00:03.000
 2          500         2012-08-30 10:00:03.000
 3          400         2012-08-30 10:00:03.000
 4          550         2012-08-30 10:00:03.000
 5          220         2012-08-30 10:00:03.000
 6          110         2012-08-30 10:00:03.000
 1          200         2012-08-30 11:00:03.000
 2          600         2012-08-30 11:00:03.000
 3          450         2012-08-30 11:00:03.000
 4          200         2012-08-30 11:00:03.000
 5          240         2012-08-30 11:00:03.000
 6          50          2012-08-30 11:00:03.000

Предполагаемый вывод: ( Это всего один день, для каждого дня будет необходим блок доступных данных)

DG         Usage       UploadDateTime
 ---------  ---------  ----------
 1          200         2012-08-30 11:00:03.000
 2          600         2012-08-30 11:00:03.000
 3          450         2012-08-30 11:00:03.000
 4          550         2012-08-30 10:00:03.000
 5          240         2012-08-30 11:00:03.000
 6          110         2012-08-30 10:00:03.000

РЕДАКТИРОВАТЬ ** Я обновил поля, чтобы они не отражали зарезервированные слова.

Ответы [ 3 ]

0 голосов
/ 14 января 2020

Если вы хотите, чтобы время после даты, как у вас в «предполагаемом выводе», вы можете использовать номер строки:

SELECT [group],
       usage,
       [datetime]
FROM
(
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY [group], CAST([datetime] AS DATE) ORDER BY usage DESC) AS Row_Num
    FROM #Usage
) UsageRow
WHERE Row_Num = 1;
0 голосов
/ 15 января 2020

Я почти уверен, что это то, что вы хотите (я добавил немного данных для другой даты)

use tempdb
GO
DROP TABLE IF EXISTS #DATA
CREATE TABLE #DATA (
    DG INTEGER
    , Usage INTEGER
    , UploadDateTime DATETIME2(3)
)

INSERT INTO #DATA (
    DG, Usage, UploadDateTime
)
SELECT 1,          100,         '2012-08-30 10:00:03.000' UNION ALL
SELECT  2,          500,         '2012-08-30 10:00:03.000' UNION ALL
SELECT  3,          400,         '2012-08-30 10:00:03.000' UNION ALL
SELECT  4,          550,         '2012-08-30 10:00:03.000' UNION ALL
SELECT  5,          220,         '2012-08-30 10:00:03.000' UNION ALL
SELECT  6,          110,         '2012-08-30 10:00:03.000' UNION ALL
SELECT  1,          200,         '2012-08-30 11:00:03.000' UNION ALL
SELECT  2,          600,         '2012-08-30 11:00:03.000' UNION ALL
SELECT  3,          450,         '2012-08-30 11:00:03.000' UNION ALL
SELECT  4,          200,         '2012-08-30 11:00:03.000' UNION ALL
SELECT  5,          240,         '2012-08-30 11:00:03.000' UNION ALL
SELECT  6,          50 ,         '2012-08-30 11:00:03.000' UNION ALL
SELECT  6,          51 ,         '2012-08-31 10:00:03.000' UNION ALL
SELECT  6,          52 ,         '2012-08-31 11:00:03.000' 

SELECT * FROM #DATA

-- what is the max usage for each DG by date
SELECT DG, CAST(UploadDateTime AS DATE) AS UploadDate, MAX(Usage)
FROM #DATA
GROUP BY DG, CAST(UploadDateTime AS DATE)

-- using the max usage for each DG by date to join back to the orginal data
-- to get the datetime that relates to the max value
; WITH MAXES AS (
    SELECT DG, CAST(UploadDateTime AS DATE) AS UploadDate, MAX(Usage) AS MaxUsage
    FROM #DATA
    GROUP BY DG, CAST(UploadDateTime AS DATE)
)
SELECT #DATA.*
FROM #DATA
INNER JOIN MAXES    
    ON #DATA.DG = MAXES.DG
    AND CAST(#DATA.UploadDateTime AS DATE) = MAXES.UploadDate
    AND #DATA.Usage = MaxUsage
ORDER BY UploadDate ASC, DG ASC
0 голосов
/ 14 января 2020

Во-первых, вам нужно преобразовать столбец date в дату, используя CONVERT(date, [UploadDateTime]). Я предполагаю, что у вашего фактического столбца есть имя, которое не datetime, и вы хотите, чтобы SUM для каждой группы для каждого дня было тем, что показывают результаты выборки.

Затем с SUM и GROUP BY Вы можете сделать что-то вроде:

SELECT
    DG,
    SUM(Usage) AS [UseForDay],
    CONVERT(date, [UploadDateTime]) AS [UploadDateTime]
FROM
    MyTable
GROUP BY
    DG,    
    CONVERT(date, [UploadDateTime])
...