Sql-Server
在同一記錄的多個欄位中查找最大和最小日期
我有一個包含 4 個不同數據類型欄位的表。對於每條記錄,我需要找到它們的最大和最小日期。
對於唯一欄位上的一組記錄,這很容易做到。但是在我的情況下如何在不使用游標的情況下做到這一點?
我需要某種接收欄位列表的函式,例如
max(field1, field2, field3, field4)
.
如果我理解正確,我會使用
CROSS APPLY
withVALUES
來“取消透視”您的欄位,然後使用標準MIN
並且MAX
可以使用。像這樣的東西:DECLARE @T TABLE (ID int IDENTITY, f1 int, f2 int, f3 int, f4 int); INSERT INTO @T (f1, f2, f3,f4) VALUES (1, 2, 3, 4), (5, 6, 7, 8), (7, 8, 0, 1), (2, 3, 6, 5); SELECT ID, MIN(f) AS MinF, MAX(f) AS MaxF FROM @T CROSS APPLY ( VALUES (f1), (f2), (f3), (f4) ) AS CA(f) GROUP BY ID ORDER BY ID;
或沒有
CROSS APPLY
:SELECT ID ,(SELECT MIN(f) FROM (VALUES (f1), (f2), (f3), (f4)) AS Fields(f)) AS MinF ,(SELECT MAX(f) FROM (VALUES (f1), (f2), (f3), (f4)) AS Fields(f)) AS MaxF FROM @T ORDER BY ID;
同一主題的另一種變體。內聚合
CROSS APPLY
。SELECT ID, MinF, MaxF FROM @T CROSS APPLY ( SELECT MIN(f) AS MinF, MAX(f) AS MaxF FROM (VALUES (f1), (f2), (f3), (f4)) AS Fields(f) ) AS CA ORDER BY ID;
所有變體返回相同的結果
+----+------+------+ | ID | MinF | MaxF | +----+------+------+ | 1 | 1 | 4 | | 2 | 5 | 8 | | 3 | 0 | 8 | | 4 | 2 | 6 | +----+------+------+
最後一個變體對這個簡單的表有一個更好看的執行計劃。