2016-09-30 51 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