#mysql
Вопрос:
У меня есть SQL table
такой:
pr_Key | fr_Key | attr_1 | attr_2 |
---|---|---|---|
р_1 | f_1 | 100 | 150 |
р_2 | f_1 | 150 | 200 |
p_3 | f_1 | 200 | 250 |
p_4 | f_2 | 100 | 150 |
р_5 | f_2 | 150 | 200 |
р_6 | f_2 | 200 | 250 |
Но, я только хочу, чтобы select
все minimum
и maximum
для attr_1
и attr_2
fr_Key
просто так:
| pr_Key | fr_Key | attr_1 | attr_2 |
| ------ | ------ | ------ | ------ |
| p_1 | f_1 | 100 | 150 | <-- the minimum values of f_1
| p_3 | f_1 | 200 | 250 | <-- the maximum values of f_1
| p_4 | f_2 | 100 | 150 | <-- the minimum values of f_2
| p_6 | f_2 | 200 | 250 | <-- the maximum values of f_2
Редактировать:
В том же вопросе, но таблица выглядит так:
| pr_Key | fr_Key | attr_1 | attr_2 |
| ------ | ------ | ------ | ------ |
| p_1 | f_1 | 200 | 250 |
| p_2 | f_1 | 150 | 200 |
| p_3 | f_1 | 100 | 150 |
| p_4 | f_2 | 150 | 200 |
| p_5 | f_2 | 200 | 250 |
| p_6 | f_2 | 100 | 150 |
Комментарии:
1. Хотя могут быть дубликаты вопроса, речь идет о двух столбцах, а не об одном, поэтому предложенный дубликат был неуместен.
Ответ №1:
Один метод использует коррелированные подзапросы в where
предложении:
select t.*
from t
where t.attr1 = (select min(t2.attr1) from t t2 where t2.fr_Key = t.fr_Key) or
t.attr1 = (select max(t2.attr1) from t t2 where t2.fr_Key = t.fr_Key) or
t.attr2 = (select min(t2.attr2) from t t2 where t2.fr_Key = t.fr_Key) or
t.attr2 = (select max(t2.attr2) from t t2 where t2.fr_Key = t.fr_Key);
Редактировать:
На самом деле, я думаю, вам нужны минимум и максимум в обоих столбцах. Если это так:
select t.*
from t
where least(t.attr1, t.attr2) =
(select least(min(t2.attr1), min(t2.attr2))
from t t2
where t2.fr_Key = t.fr_Key
) or
greatest(t.attr1, t.attr2) =
(select greatest(max(t2.attr1), max(t2.attr2))
from t t2
where t2.fr_Key = t.fr_Key
)
Ответ №2:
Напр.
SELECT DISTINCT a.*
FROM my_table a
JOIN
( SELECT fr_key,1 attr, MIN(attr_1) val FROM my_table GROUP BY fr_key
UNION
SELECT fr_key,2, MIN(attr_2) val FROM my_table GROUP BY fr_key
UNION
SELECT fr_key,1 attr, MAX(attr_1) val FROM my_table GROUP BY fr_key
UNION
SELECT fr_key,2, MAX(attr_2) val FROM my_table GROUP BY fr_key
) b
ON b.fr_key = a.fr_key
AND CASE WHEN attr = 1 THEN b.val = attr_1 ELSE b.val = attr_2 END
;