![](/img/trans.png)
[英]How to get least/min value from multiple columns but ignore 0 as min/least value using mysql?
[英]What is the simplest way to get the least value and second least value from multiple columns (MIN function does not work this)?
下表來自 Teradata 數據庫
SELECT
sku.Item_id,
sku.Item_length,
sku.Item_width,
sku.Item_heigth,
FROM Category_item sku
Item_id | Item_length | Item_width |Item_heigth
-------------------------------------------
104174 8 6 1
9482763 8 8 8
8434610 8 9 1
2109145 54 34 2
567106 41 41 2
2028731 3 4 3
我想要的最終結果是,
Item_id | Item_length | Item_width |Item_heigth | MinValue | SecondMinVale
---------------------------------------------------------------------------
104174 8 6 1 1 6
9482763 8 8 8 8 8
8434610 8 9 1 1 8
2109145 54 34 2 2 34
567106 41 41 2 2 41
2028731 3 4 3 3 3
所以我在網上做了一些研究,他們中的大多數使用 MIN 函數和子查詢或按分區原始。 Min 函數對我不起作用,因為我有三個單獨的列。 我想從上述三列中獲得最小或至少兩個值。
我嘗試使用 Least 函數執行子查詢或 CTE,但我堅持獲得第二個最小值。 我不確定如何為此使用原始分區。
對此的任何幫助將不勝感激。
非常感謝!!
你可以這樣做:
下面這個:
SELECT MIN(Item_caract)
FROM (VALUES (Item_length),(Item_width),(Item_heigth)) a(Item_caract)
給你所有列中的最小值
和這個:
(SELECT MIN(Item_caract)
FROM (VALUES (Item_length),(Item_width),(Item_heigth)) a(Item_caract) where Item_caract >=
(SELECT MIN(Item_caract)
FROM (VALUES (Item_length),(Item_width),(Item_heigth)) a(Item_caract))
給你比上面的最小值大的最小值
以下是完整查詢:
select * ,
(SELECT MIN(Item_caract)
FROM (VALUES (Item_length),(Item_width),(Item_heigth)) a(Item_caract))
AS MinValue ,
(SELECT MIN(Item_caract)
FROM (VALUES (Item_length),(Item_width),(Item_heigth)) a(Item_caract) where Item_caract >=
(SELECT MIN(Item_caract)
FROM (VALUES (Item_length),(Item_width),(Item_heigth)) a(Item_caract))
)
AS SecondMinVale
from cte
輸出:
104174 8 6 1 1 1
567106 41 41 2 2 2
2028731 3 4 3 3 3
2109145 54 34 2 2 2
8434610 8 9 1 1 1
9482763 8 8 8 8 8
如果沒有基於集合的分析函數,您的需求就很困難。 我可能會建議取消數據透視:
WITH cte AS (
SELECT Item_id, Item_length AS item FROM Category_item UNION ALL
SELECT Item_id, Item_width FROM Category_item UNION ALL
SELECT Item_id, Item_height FROM Category_item
),
cte2 AS (
SELECT Item_id, item,
ROW_NUMBER() OVER (PARTITION BY Item_id ORDER BY item) rn
FROM cte
)
SELECT
t1.Item_id,
t1.Item_length,
t1.Item_width,
t1.Item_height,
MAX(CASE WHEN rn = 1 THEN t2.item END) AS MinValue,
MAX(CASE WHEN rn = 2 THEN t2.item END) AS SecondMinValue
FROM Category_item t1
INNER JOIN cte2 t2
ON t1.Item_id = t2.Item_id
WHERE
t2.rn <= 2
GROUP BY
t1.Item_id,
t1.Item_length,
t1.Item_width,
t1.Item_height;
請注意,需要使用這種unpivoting操作可能會嚴重意味着你的表應與各種測量存儲每個項目跨行,而不是跨列進行重新設計。
如果你真的有三列,你可以簡單地應用這個蠻力邏輯:
SELECT sku.*,
Least(Item_length,Item_width,Item_height) AS MinValue,
CASE
WHEN Item_length BETWEEN Least(Item_width, Item_height) AND
Greatest(Item_width, Item_height)
THEN Item_length
WHEN Item_width BETWEEN Least(Item_length, Item_height) AND
Greatest(Item_length, Item_height)
THEN Item_width
WHEN Item_height BETWEEN Least(Item_width, Item_length) AND
Greatest(Item_width, Item_length)
THEN Item_height
END AS SecondMinValue
FROM Category_item sku
對於三個以上的列,您需要 Tim 的方法,這是一個輕微的變化(如果您的 TD 版本支持 UNPIVOT)避免連接:
WITH cte AS
(
SELECT up.*
,Row_Number() Over (PARTITION BY item_id ORDER BY val) AS rn
FROM Category_item
UNPIVOT
( val
FOR measure
IN (Item_length AS 'l'
,Item_width AS 'w'
,Item_height AS 'h')
) AS up
)
SELECT
Item_id,
Max(CASE WHEN measure = 'l' THEN val END) AS item_length,
Max(CASE WHEN measure = 'w' THEN val END) AS item_width,
Max(CASE WHEN measure = 'h' THEN val END) AS item_height,
Max(CASE WHEN rn = 1 THEN val END) AS MINVALUE,
Max(CASE WHEN rn = 2 THEN val END) AS SecondMinValue
FROM cte
GROUP BY
Item_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.