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

Вот что пытается им, но этот запрос возвращает только один ряд со всеми значениями:

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

Я хочу результаты быть (для каждый вал колонки выбрать идентификатор, мин, как мин (valx), где средний = 1):

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

Одно примечание: количество столбцов может быть до 50 (valx где х число от 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

Ваш запрос дает мне только 1 строку с наименьшим значением val1. – exexe

+0

Я пробовал в sqlfiddle http://sqlfiddle.com/#!9/451cb/5, и он дает мне именно ваш желаемый результат – Jayvee

+0

Возможно, это проблема с моей базой данных или проблемой с системой float, которую я использую для моих столбцов val. Изменить: возможно, проблема с моим db, 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. этот код является просто простым выбором/группой. после публикации, обнаружил, что это не то, чего хочет ассер. Я опубликовал еще один, который отвечает на проблему, но для 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

Im ищет запрос, который дает 5 строк с наименьшим значением для val1, val2, val3, val4, val5 не самый маленький из списка (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 minimum 
7 3 
7 2 
4 5 
1 1 
7 2 

Обратите внимание на 4 5 пара вы на самом деле 5 4 5, но было бы минимальное значение в val3, потому что 4 представлен здесь в середине = 2. Таким образом, идентификатор значения 5, 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

@ Бармар прав. Непризнанное ключевое слово. (около «Наружный» в позиции 65) – exexe