Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как групирате по времеви интервал?

Мисля, че прекалявате с усложняването.
Можете да използвате GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 за групиране на всеки 30 минути. Разбира се, датата, която избрах, е случайна. Можете да изберете, ако желаете, първата (или последната) дата във вашите примерни данни.
И можете също да използвате тази техника, за да получите всеки интервал от всяка част от времето - просто променете ключовата дума MINUTE до всяка част от датата, която искате да използвате, и интервала 30 до произволен интервал, който желаете.

Разгледайте следните примерни данни:

;WITH CTE AS 
(
    SELECT CAST('2017-01-01T00:00:00' as datetime) As TheDateTime, 0 as rn
    UNION ALL
    SELECT DATEADD(MINUTE, 1, TheDateTime), rn + 1
    FROM CTE
    WHERE rn < 60
)

SELECT TheDateTime, rn INTO #T
FROM CTE
OPTION(MAXRECURSION 0)

#T сега съдържа следните данни:

TheDateTime                 rn
2017-01-01 00:00:00.000     0
2017-01-01 00:01:00.000     1
2017-01-01 00:02:00.000     2
2017-01-01 00:03:00.000     3
...
2017-01-01 00:59:00.000     59
2017-01-01 01:00:00.000     60

За да получите максималния rn, групиран по 30 минути, трябва само това:

SELECT DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30, MAX(rn)
FROM #T
GROUP BY DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30

Резултати:

interval    max_rn
0           29
1           59
2           60



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Застой при ИЗБЕРЕТЕ/АКТУАЛИЗИРАНЕ

  2. Мога ли да използвам CTE на SQL Server за обединяване на пресичащи се дати?

  3. SQL:Актуализиране на ред и връщане на стойност на колона с 1 заявка

  4. Индексът не се прилага при индексиран изглед

  5. Как мога да изчистя кеша на заявките на SQL Server?