我正在嘗試按日期排序并按另一個欄位分組。似乎具有挑戰性,因為ORDER BYandGROUP BY子句使用相同的欄位進行聚合。
這是一些示例資料:
| 日期 | 手術 | 數數 |
|---|---|---|
| 2021-10-13 9:12:00 | 訪問次數 | 2 |
| 2021-10-13 8:11:00 | 通話 | 1 |
| 2021-10-13 7:10:30 | 通話 | 3 |
| 2021-10-13 6:00:00 | 通話 | 5 |
| 2021-10-13 5:10:00 | 訪問次數 | 2 |
| 2021-10-13 4:00:00 | 訪問次數 | 1 |
| 2021-10-12 3:20:00 | 通話 | 2 |
| 2021-10-12 2:10:00 | 通話 | 2 |
| 2021-10-12 1:00:00 | 訪問次數 | 2 |
我需要在不同的日子顯示“訪問”和“通話”組。結果應該是:
| 日期 | 手術 | 數數 |
|---|---|---|
| 2021-10-13 | 訪問次數 | 2 |
| 2021-10-13 | 通話 | 9 |
| 2021-10-13 | 訪問次數 | 3 |
| 2021-10-12 | 通話 | 4 |
| 2021-10-12 | 訪問次數 | 2 |
現在,我已經嘗試過:
SELECT
CAST([Date] AS DATE) [Date],
Operation,
SUM([Count])
FROM Table
GROUP BY CAST([Date] AS DATE), Operation
ORDER BY CAST([Date] AS DATE) DESC, Operation
但它給出了以下結果:
| 日期 | 手術 | 數數 |
|---|---|---|
| 2021-10-13 | 通話 | 9 |
| 2021-10-13 | 訪問次數 | 5 |
| 2021-10-12 | 通話 | 4 |
| 2021-10-12 | 訪問次數 | 2 |
這是一個使作業更容易的小提琴:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=39bb598378b35603ca98c0c4733d8f92
我現在正在考慮添加一個帶有名為“組”的附加列的臨時表,但我不確定是否可以嘗試更好的解決方案。我看過類似問題的答案,但“日期”問題似乎有所不同
你能分享一下想法嗎?
uj5u.com熱心網友回復:
正如所討論的,這是間隙/孤島問題,它只需要隔離額外的不同組,使用運行計數并減去由每組行劃分的計數:
with grp as (
select Convert(date, [date]) [Date], operation, [count],
Row_Number() over(order by [date])
- Row_Number() over(partition by operation, Convert(date, [date]) order by date) gp
from t
)
select date, operation, Sum([count]) [Count]
from grp
group by [date], operation, gp
order by [date] desc, gp desc
資料庫小提琴
uj5u.com熱心網友回復:
我可能最終會使用 CTE(可能有一種方法可以類似于您已經嘗試過的方法)。類似的東西:
WITH x AS(
SELECT CAST([Date] AS DATE) [Date],
Operation,
SUM(t.[Count]) as [Count]
FROM [MyTable]
GROUP BY CAST([Date] AS DATE),
Operation )
SELECT x.[Date],
x.Operation,
x.[Count]
FROM x AS x
ORDER BY x.[Date] desc,
x.Operation;
雖然; 如果你想要展示類似的東西:
X 次呼叫先于 Y 次訪問,然后在一天結束前又有 z 次呼叫。
然后,您將需要更多自定義內容,例如評論中鏈接的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/381071.html
標籤:sql-server 查询语句
下一篇:拆分一列并獲取所有計算出的行
