按X小时/天/周划分的SQL Server组

按X小时/天/周划分的SQL Server组,sql,sql-server,Sql,Sql Server,我想知道您如何能够按X天(以及其他受支持的DATEPARTperiods)对记录进行分组 我找到了两种方法来按天/月/分组。。。使用以下查询: /** Group by one day method 1 **/ SELECT SUM(Id) AS Id, DATEADD(DAY, 0, DATEDIFF(DAY, 0, DateTime)) AS DateTime FROM Reporting GROUP BY DATEADD(DAY, 0, DATED

我想知道您如何能够按X天(以及其他受支持的
DATEPART
periods)对记录进行分组

我找到了两种方法来按天/月/分组。。。使用以下查询:

/** Group by one day method 1 **/
SELECT 
    SUM(Id) AS Id, 
    DATEADD(DAY, 0, DATEDIFF(DAY, 0, DateTime)) AS DateTime 
FROM 
    Reporting
GROUP BY 
    DATEADD(DAY, 0, DATEDIFF(DAY, 0, DateTime))
ORDER BY 
    DateTime DESC

/** Group by one day method 2 **/
SELECT 
    SUM(Id) AS Id, 
    MIN(DATEADD(DAY, 0, DATEDIFF(DAY, 0, DateTime))) AS DateTime 
FROM 
    Reporting
GROUP BY 
    DATEPART(YEAR, DateTime), 
    DATEPART(MONTH, DateTime), 
    DATEPART(DAY, DateTime)
ORDER BY 
    DateTime DESC
我希望它会像增加查询中的数字0一样简单,但这似乎不起作用。有没有一个简单的解决办法,因为我在网上找不到任何例子

另一个要求是,周期的开始(如果容易的话,还有结束)应添加为列(类型:dateTime)

有人能用这个把我推向正确的方向吗

提前谢谢

编辑:


这个问题可能解释得不是很好,给出的答案确实帮助了我。如果我再次陷入困境,我将在我的特定用例中发布另一个问题。

如果您想按天数(或其他日期部分)分组,可以使用算术:

SELECT DATEADD(DAY, 0, 10 * (DATEDIFF(DAY, 0, DateTime) / 10) ) as DateTime,
       SUM(Id) as Id
FROM Reporting
GROUP BY DATEADD(DAY, 0, DATEDIFF(DAY, 0, DateTime))
ORDER BY MIN(DateTime) DESC;
SQL Server执行整数除法,因此这会将日期截断为小于该值10的倍数(或任意值)。使用
floor
()`,您可以更清楚一点:

可以使用隔离select语句中的分组逻辑。下面是一个完整的示例:

DECLARE @table TABLE (id INT IDENTITY(1,1), dt DATETIME)

;WITH cte AS (
    SELECT GETDATE() dt
    UNION ALL 
    SELECT DATEADD(MINUTE, -10, dt)
    FROM cte 
    WHERE dt > GETDATE() - 10
)
INSERT INTO @table (dt) 
SELECT * FROM cte
OPTION (MAXRECURSION 0);  

SELECT 
CAST(dt AS DATE) AS DayPart, 
COUNT(*) OVER (PARTITION BY CAST(dt AS DATE), 0) AS DayCount,
DATEADD(HOUR, DATEDIFF(HOUR, 0, dt), 0) AS HourPart, 
COUNT(*) OVER (PARTITION BY DATEADD(HOUR, DATEDIFF(HOUR, 0, dt), 0)) AS HourCount,
dt
FROM @table
返回:

DayPart     DayCount    HourPart                    HourCount   dt
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:57:16.887
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:47:16.887
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:37:16.887
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:27:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:57:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:47:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:37:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:27:16.887
... etc

样本数据和期望的结果将非常有用。“x天分组”是什么意思?你的问题不清楚。如果您想按2天分组,并且连续3天有记录,那么哪两天应该分组在一起?tnx@gordon linoff
DayPart     DayCount    HourPart                    HourCount   dt
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:57:16.887
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:47:16.887
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:37:16.887
2018-07-06  82          2018-07-06 10:00:00.000     4           2018-07-06 10:27:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:57:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:47:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:37:16.887
2018-07-06  82          2018-07-06 11:00:00.000     6           2018-07-06 11:27:16.887
... etc