SQL Server组X小时/天/周

时间:2018-07-16 15:06:03

标签: sql sql-server

我想知道您将如何在X天(以及其他受支持的 def all_trials(request): return HttpResponseRedirect(URL_TO_XML_IN_STATIC) 期间)对记录进行分组。

使用以下查询,我发现了按天/月/ ...分组的两种方法:

DATEPART

我希望这和增加查询中的数字0一样容易,但这似乎行不通。是否有一个简单的解决方案,因为我在网上找不到任何示例?

另一个要求是,应将句点的开始(和-如果容易的话,结束)添加为列(类型:dateTime)。

有人可以用这个方法将我推向正确的方向吗?

谢谢。

编辑:

这个问题可能解释得不是很好,给出的答案确实对我有进一步的帮助。如果再次遇到问题,我将针对我的具体用例发布另一个问题。

2 个答案:

答案 0 :(得分:1)

如果要按天段(或其他日期部分)分组,则可以使用算术:

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 DATEADD(DAY, 0, 10 * FLOOR(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;

答案 1 :(得分:0)

您可以使用Aggregate Window Functions在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