有兩個導數據的需求,
1、一張表里面每一個訂單號可能對應多條數據,每個單號返回時間最早的那條。
2、根據條件查詢某個字段並按照逗號,合並在一起。
表類似結構如下:
第一條sql:
select c.Id,c.OrderNum, c.CreateTime FROM (select t.*,row_number() over(partition by t.OrderNum order by t.CreateTime ) rn from Payinfo t WHERE t.OrderNum IN('20160906025229','20160905006031','20160905016570')) c WHERE rn = 1;
執行效果如下:
主要知識點:over partition by
over partition by關鍵字是分析性函數的一部分,它和聚合函數不同的地方在於它能返回一個分組中的多條記錄,常用於給結果集分組,如果沒有指定那么它把整個結果集作為一個分組 。
Group by 與 over partition by都可以實現分組統計功能.
Group by 根據一列或者多列的值或表達式將選定的行進行一個摘要分組,每一個分組只返回一行。
第二條sql:
SELECT TOP 1 data=STUFF((SELECT ','+ CAST(id AS VARCHAR(10)) FROM Payinfo t WHERE OrderNum IN('20160906025229','20160905006031') FOR XML PATH('')), 1, 1, '')
FROM Payinfo t1
執行效果如下:
主要知識點:FOR XML PATH
將查詢結果集以XML形式展現,有了它我們可以簡化我們的查詢語句實現一些以前可能需要借助函數活存儲過程來完成的工作。
有關FOR XML PATH更多知識,我覺得下面這篇文章講的很好:
靈活運用 SQL SERVER FOR XML PATH