sql >> Databáze >  >> RDS >> Sqlserver

Jak seskupujete podle libovolného časového intervalu?

Myslím, že to zbytečně komplikujete.
Můžete použít GROUP BY (DATEDIFF(MINUTE, '2017-01-01', TheDateTime) / 30 pro seskupování po každých 30 minutách. Datum, které jsem zvolil, je samozřejmě jen náhodné. Pokud chcete, můžete si vybrat první (nebo poslední) datum ve vzorových datech.
Tuto techniku ​​můžete také použít k získání každého intervalu jakékoli časové části – stačí změnit klíčové slovo MINUTE na jakoukoli část data, kterou chcete použít, a interval 30 na libovolný interval.

Zvažte následující ukázková data:

;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 nyní obsahuje následující data:

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

Chcete-li získat maximální rn seskupené po 30 minutách, potřebujete toto:

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

Výsledky:

interval    max_rn
0           29
1           59
2           60



  1. Jak uložím řetězec delší než 4000 znaků v databázi Oracle pomocí Java/JDBC?

  2. Získejte nejnovější datum ze seskupených dat MySQL

  3. Jaký je maximální počet připojení ke stolu v MariaDB?

  4. Dynamicky vytvářet PHP objekt založený na řetězci