我有Table1
如下:
Account Name Flagged
------- ---- -------
001 John 0
001 Jacob 0
002 Austin 0
002 Ashley 1
003 Mary 1
003 Megan 1
这是我想弄清楚的简化版本。基本上我有一组帐户ID,如果需要,每个帐户ID基本上可以附加无限数量的名称。有些会有1个名字,有些会有1000个名字。每个名称都标记为0或1.
对于每个帐户,我想:
对于这个小桌子,我希望它返回
Account Name Flagged
------- ---- -------
001 John 0
001 Jacob 0
002 Austin 0
003 Mary 1
003 Megan 1
答案 0 :(得分:3)
戈登的解决方案是正确的。但是,您也可以使用MIN
窗口函数来获取每个帐户的最小标记(假设标记的值仅为0和1)并且只获取那些行。
select account,name,flagged
from (select t.*,min(flagged) over(partition by account) as min_flag
from tablename t
) x
where flagged=min_flag
答案 1 :(得分:2)
这是优先级查询的一种形式。我认为最简单的方法是not exists
union all
:
select t1.*
from table1 t1
where t1.flagged = 0
union all
select t1.*
from table1 t1
where t1.flagged = 1 and
not exists (select 1
from table1 tt1
where tt1.account = t1.account and tt1.flagged = 0
);
这个想法很简单:选择标志为0的所有行。然后选择标志为1的所有行,只有当没有相应的行为零时才会选择。
答案 2 :(得分:0)
有几种方法可以返回指定的结果。
以下是使用NOT EXISTS谓词和相关子查询的一种方法的示例:
SELECT t.account
, t.name
, t.flagged
FROM [Table1] t
WHERE t.flagged = 0
OR ( t.flagged = 1 AND NOT EXISTS
( SELECT 1
FROM [Table1] f
WHERE f.account = t.account
AND f.flagged = 0
)
)
ORDER BY t.account, t.name, t.flagged
以下是使用联接到内联视图的方法示例:
SELECT t.account
, t.name
, t.flagged
FROM ( SELECT n.account
, MIN(n.flagged) AS mf
FROM [Table1] n
WHERE n.flagged IN (0,1)
GROUP BY n.account
) s
JOIN [Table1] t
ON t.account = s.account
AND t.flagged = s.mf
ORDER BY t.account, t.name, t.flagged
编辑:原始示例使用MySQL语法;修改了查询,因此语法与SQL Server兼容。