Sql-Server

在同一記錄的多個欄位中查找最大和最小日期

  • February 24, 2021

我有一個包含 4 個不同數據類型欄位的表。對於每條記錄,我需要找到它們的最大和最小日期。

對於唯一欄位上的一組記錄,這很容易做到。但是在我的情況下如何在不使用游標的情況下做到這一點?

我需要某種接收欄位列表的函式,例如max(field1, field2, field3, field4).

如果我理解正確,我會使用CROSS APPLYwithVALUES來“取消透視”您的欄位,然後使用標準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;

SQL小提琴

所有變體返回相同的結果

+----+------+------+
| ID | MinF | MaxF |
+----+------+------+
|  1 |    1 |    4 |
|  2 |    5 |    8 |
|  3 |    0 |    8 |
|  4 |    2 |    6 |
+----+------+------+

最後一個變體對這個簡單的表有一個更好看的執行計劃。

引用自:https://dba.stackexchange.com/questions/120180