SQL SELECT;选择与帐户关联的名称。三个用例

时间:2017-02-14 02:33:47

标签: sql sql-server tsql

我有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.

对于每个帐户,我想:

  1. 如果所有行都标记为= 0
  2. ,请选择所有行
  3. 如果所有行都已标记= 1
  4. ,请选择所有行
  5. 如果行具有混合标志,则仅选择标记为= 0的行。即有些是0,有些是1
  6. 对于这个小桌子,我希望它返回

    Account    Name     Flagged
    -------    ----     -------
    001        John        0
    001        Jacob       0
    002        Austin      0
    003        Mary        1
    003        Megan       1
    

3 个答案:

答案 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兼容。