连续获得最小值
Get Least Value in a row
我有如下一行 12 个月的条目,我想获得其中的最小值。我有一个用 CASE
表达式实现的想法,但在可读性方面看起来太复杂了。
Table
+----------------------------------------------------------------------------+
| Id | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
+----------------------------------------------------------------------------+
| 1 | 0.1 | 1 | -2 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 |
| 2 | 3 | 2 | 5 | 2.5 | 3 | 6 | 10 | 1.1 | 2.8 | 2.6 | 5.6 | 1.8 |
| 3 | -1 | 1 | 3 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 |
+----------------------------------------------------------------------------+
预期输出
+------------------------------------------------------------------------------------+
| Id | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Least |
+------------------------------------------------------------------------------------+
| 1 | 0.1 | 1 | -2 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 | -2 |
| 2 | 3 | 2 | 5 | 2.5 | 3 | 6 | 10 | 1.1 | 2.8 | 2.6 | 5.6 | 1.8 | 1.1 |
| 3 | -1 | 1 | 3 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 | -1 |
+------------------------------------------------------------------------------------+
我已经尝试过如下查询,但在可读性方面太复杂了 - 有什么方法可以更有效地做到这一点吗?
SELECT Id, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec,
CASE WHEN Jan< Feb && Jan < Mar && Jan < Apr && Jan < MAY && Jan < Jun && Jan < Jul && Jan < Aug && Jan < Sep && Jan < Oct && Jan < Nov && Jan < Dec THEN Jan
WHEN Feb < Jan && Feb < Mar && Feb < Apr && Feb < MAY && Feb < Jun && Feb < Jul && Feb < Aug && Feb < Sep && Feb < Oct && Feb < Nov && Feb < Dec THEN Feb
WHEN...
END AS Least
FROM table
您可以试试cross apply
。请参阅以下脚本:
SELECT Id, Jan, Feb, Mar, Apr, May, Jun, Jul ,Aug, Sep, Oct, Nov, Dec, Least
FROM Test
CROSS APPLY (SELECT MIN(MinColVal) AS Least FROM (VALUES (Jan),(Feb),(Mar),(Apr),(May),(Jun),(Jul),(Aug),(Sep),(Oct),(Nov),(Dec)) AS a(MinColVal))tab
这应该可以解决问题。
SELECT ID, MIN(MONTH) AS Least
FROM
(
SELECT JAN AS MONTH
FROM ##table
UNION ALL
SELECT FEB AS MONTH
FROM ##table
UNION ALL
SELECT MAR AS MONTH
FROM ##table
) mon
GROUP BY ID
我有如下一行 12 个月的条目,我想获得其中的最小值。我有一个用 CASE
表达式实现的想法,但在可读性方面看起来太复杂了。
Table
+----------------------------------------------------------------------------+
| Id | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec |
+----------------------------------------------------------------------------+
| 1 | 0.1 | 1 | -2 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 |
| 2 | 3 | 2 | 5 | 2.5 | 3 | 6 | 10 | 1.1 | 2.8 | 2.6 | 5.6 | 1.8 |
| 3 | -1 | 1 | 3 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 |
+----------------------------------------------------------------------------+
预期输出
+------------------------------------------------------------------------------------+
| Id | Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Least |
+------------------------------------------------------------------------------------+
| 1 | 0.1 | 1 | -2 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 | -2 |
| 2 | 3 | 2 | 5 | 2.5 | 3 | 6 | 10 | 1.1 | 2.8 | 2.6 | 5.6 | 1.8 | 1.1 |
| 3 | -1 | 1 | 3 | -0.5| 3 | 5 | 9 | 1.5 | 2.5 | 3.6 | 3.6 | 2.5 | -1 |
+------------------------------------------------------------------------------------+
我已经尝试过如下查询,但在可读性方面太复杂了 - 有什么方法可以更有效地做到这一点吗?
SELECT Id, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec,
CASE WHEN Jan< Feb && Jan < Mar && Jan < Apr && Jan < MAY && Jan < Jun && Jan < Jul && Jan < Aug && Jan < Sep && Jan < Oct && Jan < Nov && Jan < Dec THEN Jan
WHEN Feb < Jan && Feb < Mar && Feb < Apr && Feb < MAY && Feb < Jun && Feb < Jul && Feb < Aug && Feb < Sep && Feb < Oct && Feb < Nov && Feb < Dec THEN Feb
WHEN...
END AS Least
FROM table
您可以试试cross apply
。请参阅以下脚本:
SELECT Id, Jan, Feb, Mar, Apr, May, Jun, Jul ,Aug, Sep, Oct, Nov, Dec, Least
FROM Test
CROSS APPLY (SELECT MIN(MinColVal) AS Least FROM (VALUES (Jan),(Feb),(Mar),(Apr),(May),(Jun),(Jul),(Aug),(Sep),(Oct),(Nov),(Dec)) AS a(MinColVal))tab
这应该可以解决问题。
SELECT ID, MIN(MONTH) AS Least
FROM
(
SELECT JAN AS MONTH
FROM ##table
UNION ALL
SELECT FEB AS MONTH
FROM ##table
UNION ALL
SELECT MAR AS MONTH
FROM ##table
) mon
GROUP BY ID