2016-09-30 49 views
1

示例模式:與最小值選擇多列

id val1 val2 val3 val4 val5 mid 
1 5  6 7 1 4 1 
4 7  8 5 9 5 1 
5 4  1 4 2 7 2 
7 3  2 8 7 2 1 

這裏是我嘗試,但此查詢只返回1的所有值列:

SELECT id, MIN(val1), MIN(val2), MIN(val3), MIN(val4), MIN(val5) FROM table WHERE mid=1 

我想要的結果是(爲每個VAL列選擇ID,作爲分分鐘(valx),其中中間= 1):

id min 
7 3 
7 2 
4 5 
1 1 
7 2 

一個注意:列的量可高達50(valx其中x是數字從1到50)。

+0

50列聽起來像壞桌子設計給我。集合函數,如「MIN」,是爲了操作記錄而不是列。 –

+0

您需要在語句結尾添加GROUP BY標識。 –

+0

目前尚不清楚。你如何得到理想的結果? – Horaciux

回答

1
select id, val1 from table where val1=(select min(val1) from table where mid=1) and mid=1 
union all 
select id, val2 from table where val2=(select min(val2) from table where mid=1) and mid=1 
union all 
select id, val3 from table where val3=(select min(val3) from table where mid=1) and mid=1 
union all 
select id, val4 from table where val4=(select min(val4) from table where mid=1) and mid=1 
union all 
select id, val5 from table where val5=(select min(val5) from table where mid=1) and mid=1 
+0

您的查詢只給我一行最小的val1。 – exexe

+0

我嘗試在sqlfiddle http://sqlfiddle.com/#!9/451cb/5,它給了我完全你想要的輸出 – Jayvee

+0

也許這就是我的數據庫問題或浮點系統的問題,即時通訊使用我的val列。編輯:可能問題與我的分貝,http://sqlfiddle.com/#!9/bd7ac/2 – exexe

0

使用LEAST()功能...

select id, least(val1, val2, <etc>) 
from myTable 
where mid=1 
+0

這不是我想要的。它給了我只有來自val1的最小值的行。 – exexe

-1
SELECT id, MIN(val1), MIN(val2), MIN(val3), MIN(val4), MIN(val5) 
FROM table 
WHERE mid=1 
GROUP by id 
+1

您的查詢爲我提供了所有列的行。 – exexe

+0

謝謝ruffp。這段代碼只是一個簡單的select/group by。發佈後,發現這不是提問者想要的。我發佈了另一個,它回答了這個問題,但對於SQL-Server。 –

0

如果我正確理解你的問題,我希望它會幫助你

SELECT id, MIN(minimum) as minimum FROM (
SELECT id, val1 As minimum FROM table where mid=1 
UNION ALL 
SELECT id, val2 As minimum FROM table where mid=1 
UNION ALL 
SELECT id, val3 As minimum FROM table where mid=1 
union All 
SELECT id, val4 As minimum FROM table where mid=1 
union ALL 
SELECT id, val5 As minimum FROM table where mid=1 
) As minvalue 
GROUP BY id 
+0

這不是我想要的。它給了我只有來自val1的最小值的行。 – exexe

+0

是不是在尋找5個值中的最小值? –

+0

我正在查詢給出val1,val2,val3,val4,val5的最小值爲5的行的列表(val1,val2,val3,val4,val5)的最小值的查詢 – exexe

1
SELECT id, minimum 
FROM 
    (SELECT MIN(Val1) as minimum FROM TableName WHERE Mid = 1) v1 
    INNER JOIN TableName t1 
    ON v1.minimum = t1.Val1 
    AND t1.Mid = 1 

UNION ALL 

SELECT id, minimum 
FROM 
    (SELECT MIN(Val2) as minimum FROM TableName WHERE Mid = 1) v2 
    INNER JOIN TableName t2 
    ON v2.minimum = t2.Val2 
    AND t2.Mid = 1 

UNION ALL 

SELECT id, minimum 
FROM 
    (SELECT MIN(Val3) as minimum FROM TableName WHERE Mid = 1) v3 
    INNER JOIN TableName t3 
    ON v3.minimum = t3.Val3 
    AND t3.Mid = 1 

UNION ALL 

SELECT id, minimum 
FROM 
    (SELECT MIN(Val4) as minimum FROM TableName WHERE Mid = 1) v4 
    INNER JOIN TableName t4 
    ON v4.minimum = t4.Val4 
    AND t4.Mid = 1 

UNION ALL 

SELECT id, minimum 
FROM 
    (SELECT MIN(Val5) as minimum FROM TableName WHERE Mid = 1) v5 
    INNER JOIN TableName t5 
    ON v5.minimum = t5.Val5 
    AND t5.Mid = 1 

這僅僅是一個討厭討厭查詢和情況,但我想清楚你想要什麼。如果你改進敘述,你可能會得到比這更好的答案。

下面是我把你想要的結果和敘述的意思。

查找Mid = 1的每列的最小值,然後查找與該最小值相關的ID。以上的結果是:

id minimum 
7 3 
7 2 
4 5 
1 1 
7 2 

注4 5對你確實有5 4 5,但將是VAL3最小值因爲表示圖4是其中中間= 2。因此,對於值5的ID是4。 ...

+0

您的查詢按照我的意願工作!但是太大了一點。無論如何謝謝你。 – exexe

0

對不起,以前的答案,沒有看到你的結果。 我希望這會給你結果。

;with cte as(
    Select a.ID 
     , t.Val 
     , ROW_NUMBER() over(partition by a.id order by t.ColNo) as ColNo 
    From @TABLE as a 
    Outer apply (Values (1,Val1), (2,Val2),(3,Val3),(4,Val4), (5,Val5)) t(ColNo,Val) 
    Where a.MID=1 
) 
, cte2 as( 
    Select ColNo, MIN(val) as MinVal 
    From cte 
    Group by ColNo 
) 
    Select a.ID, a.Val from cte as a 
    Inner join cte2 as b on a.ColNo=b.ColNo and a.Val=b.MinVal 
    Order by a.ColNo 
+0

您的小組排除(7,3)和副本(7,2)。 –

+0

我不認爲MySQL有'OUTER APPLY'。 – Barmar

+0

@Barmar是對的。無法識別的關鍵字。 (在位置65的「外」附近) – exexe