У меня есть кусок данных:(SQL) Как выбрать правильную строку для каждой группы?
+------------+-----------+-----------+------------+--------------+
| first_name | last_name | family_id | is_primary | is_secondary |
+------------+-----------+-----------+------------+--------------+
| a | b | 1 | 1 | 0 |
| aa | bb | 1 | 0 | 0 |
| c | d | 1 | 0 | 0 |
| cc | dd | 1 | 0 | 0 |
| e | f | 10 | 0 | 0 |
| e | f | 10 | 0 | 1 |
| gg | hh | 10 | 0 | 1 |
| gg | hh | 10 | 0 | 0 |
| gg | hh | 10 | 0 | 0 |
| gg | hh | 10 | 0 | 0 |
+------------+-----------+-----------+------------+--------------+
То, что я хочу сделать являются:
- Group по family_id (Таким образом, мы имеем две группы)
- Для каждой группы, если есть некоторые строки, которые имеют
is_primary
, равны 1, затем выбирают из них случайную строку и получают ее имя_ first_name и last_name как вывод из двух столбцов группы. - Для каждой группы, если нет строки, которая имеет
is_primary
равно 1, найти строку (любая строка в порядке), который имеетis_secondary
равен 1 и получить его first_name и last_name как выход двух колонок группы
Так на основе логики, описанной выше, и данных, правильно результат должен быть:
+-----------+------------+-----------+
| family_id | first_name | last_name |
+-----------+------------+-----------+
| 1 | a | b |
| 10 | e | f |
+-----------+------------+-----------+
Или
+-----------+------------+-----------+
| family_id | first_name | last_name |
+-----------+------------+-----------+
| 1 | a | b |
| 10 | gg | hh |
+-----------+------------+-----------+
Как я могу написать запрос, чтобы получить правильный результат?
Ниже приведен сценарий для создания тестовой таблицы.
USE tempdb
GO
IF OBJECT_ID('dbo.mytable') IS NOT NULL DROP TABLE dbo.mytable;
CREATE TABLE mytable (
first_name VARCHAR(2) NOT NULL,
last_name VARCHAR(2) NOT NULL,
family_id INTEGER NOT NULL,
is_primary INTEGER NOT NULL,
is_secondary INTEGER NOT NULL);
INSERT INTO mytable VALUES ('a','b',1,1,0);
INSERT INTO mytable VALUES ('aa','bb',1,0,0);
INSERT INTO mytable VALUES ('c','d',1,0,0);
INSERT INTO mytable VALUES ('cc','dd',1,0,0);
INSERT INTO mytable VALUES ('e','f',10,0,0);
INSERT INTO mytable VALUES ('e','f',10,0,1);
INSERT INTO mytable VALUES ('gg','hh',10,0,1);
INSERT INTO mytable VALUES ('gg','hh',10,0,0);
INSERT INTO mytable VALUES ('gg','hh',10,0,0);
INSERT INTO mytable VALUES ('gg','hh',10,0,0);
GO
SELECT * FROM dbo.mytable;
что вы пробовали –
Да, я попытался решить проблему, но не смог. Позвольте мне уточнить вопрос. –
Если вы хотите получить первый результат, то он не требует каких-либо усилий, просто используйте его: выберите family_id, min (first_name), min (last_name) from mytable group by family_id –