我有一个数据:(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 |
+------------+-----------+-----------+------------+--------------+
我想要做的是:
- 集团通过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;
你试过了什么 –
是的我试图解决它,但失败了。让我更新这个问题。 –
如果你想要第一个结果,那么它不需要任何的努力,简单的使用它:从mytable 组中选择family_id,min(first_name),min(last_name) family_id –