我有一個表格calls,顯示每個員工的每個電話,如下所示:
| 日期 | 員工 | call_pick_up_time |
|---|---|---|
| 2021-10-08 | 12345 | 2021-10-08 08:13:26 |
| 2021-10-08 | 123456 | 2021-10-08 08:16:42 |
現在我想顯示每 30 分鐘間隔內每位員工的通話次數:
| 間隔 | 員工 | 呼叫計數 |
|---|---|---|
| 08:00 | 12345 | 4 |
| 08:00 | 123456 | 7 |
| 08:30 | 12345 | 5 |
| 08:30 | 123456 | 3 |
考慮的時期是08:00 - 08:30 / 08:30 -09:00等等。
有沒有一種簡單的方法可以得到想要的結果?
提前致謝。
uj5u.com熱心網友回復:
我喜歡將日期時間值舍入到最接近的n分鐘間隔的方法是利用 SQL Server 的整數數學行為。如果你計算午夜和相關時間之間的分鐘差,然后除以n再乘以n,它就會去掉任何余數。所以現在四舍五入到之前的 30 分鐘間隔:
DECLARE @now datetime = GETDATE();
DECLARE @today datetime = CONVERT(date, @now);
SELECT DATEADD
(
MINUTE,
DATEDIFF(MINUTE, @today, @now)/30*30,
@today
);
我們可以通過獲取源表并使用CROSS APPLYCharlie 建議的方法將其應用于您的查詢,并將相同的計算應用于您的源值(您必須進行更多的行內轉換,因為您沒有好的靜態變數可供使用):
DECLARE @WindowSizeInMinutes smallint = 30;
SELECT x.interval, c.employee, call_count = COUNT(*)
FROM dbo.Calls AS c
CROSS APPLY
(
VALUES
(
DATEADD
(
MINUTE,
DATEDIFF
(
MINUTE,
CONVERT(datetime, CONVERT(date, call_pick_up_time)),
call_pick_up_time
) / @WindowSizeInMinutes * @WindowSizeInMinutes,
CONVERT(datetime, CONVERT(date, call_pick_up_time))
)
)
) AS x(interval)
-- WHERE c.something something
GROUP BY c.employee, x.interval;
如果有call_pick_up_time您希望使用的索引,那是不可能的。
可以使用索引的另一種方法是預先確定您所追求的范圍內所有可能的30 分鐘視窗,然后內部連接到這些視窗:
DECLARE @WindowSizeInMinutes smallint = 30,
@min_date datetime = '20211001',
@max_date datetime = '20211014';
;WITH n(n) AS
(
SELECT 0 UNION ALL
SELECT n 1
FROM n WHERE n <= 24*60/@WindowSizeInMinutes
),
days(d) AS
(
SELECT @min_date UNION ALL
SELECT DATEADD(DAY, 1, d)
FROM days WHERE d < @max_date
),
intervals AS
(
SELECT interval_start = DATEADD(MINUTE, n*@WindowSizeInMinutes, d),
interval_end = DATEADD(MINUTE, (n 1)*@WindowSizeInMinutes, d)
FROM n CROSS JOIN days
)
SELECT interval = i.interval_start,
c.employee,
call_count = COUNT(c.employee)
FROM intervals AS i
INNER JOIN dbo.Calls AS c
ON c.call_pick_up_time >= i.interval_start
AND c.call_pick_up_time < i.interval_end
GROUP BY c.employee, i.interval_start;
雖然更復雜,但這種方法的一個好處是,如果您想為沒有員工打電話的視窗顯示插槽,您可以將聯接更改為內部聯接,如果您想要為每個員工一個插槽,您可以添加帶有員工串列的 CTE 并交叉加入。
- 這個 db<>fiddle上的兩個例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313275.html
標籤:sql sql-server 查询语句
下一篇:SQLXML用條件修改特定值
