代码之家  ›  专栏  ›  技术社区  ›  demo

从多个组中仅选择一个组

  •  1
  • demo  · 技术社区  · 8 年前

    我有一张桌子

    Id | Provider | Value | IsNew
    

    我想从这个表中选择唯一的 Provider Value 为了它。

    SELECT Provider, Value
    FROM Table
    GROUP BY Provider, Value
    

    但我需要分组 IsNew 字段,因为当Provider='3'时,我只需要选择“New”记录。

    应该是这样的:

    Id | Provider | Value | IsNew
    ______________________________
    1  | 1        | 310   | 0
    ______________________________
    2  | 2        | 25    | 0
    ______________________________
    3  | 3        | 250   | 0
    ______________________________
    4  | 3        | 252   | 1
    

    结果我需要选择

    Provider | Value 
    _________________
    1        | 310   
    _________________
    2        | 25    
    _________________
    3        | 252  
    

    6 回复  |  直到 8 年前
        1
  •  1
  •   Gordon Linoff    8 年前

    你好像想要 isNew = 1 如果它存在,则返回另一个记录。

    我想这正是你想要的:

    SELECT t.Provider, t.Value
    FROM Table t
    WHERE t.isNew = 1
    UNION ALL
    SELECT t.Provider, t.Value
    FROM Table t
    WHERE t.isNew = 0 AND
          (NOT EXISTS (SELECT 1 FROM table t2 WHERE t2.Provide = t.Provide AND t2.isNew = 1);
    

    Here 是SQL小提琴。

        2
  •  0
  •   Fahmi    8 年前

    请尝试使用行号:

        select provider, value from 
    (SELECT Provider,value row_number over (partition by provider order by isnew desc) as rn
        FROM Table) a where rn=1 
    
        3
  •  0
  •   The Impaler    8 年前

    也许我不太明白,但对我来说,这似乎是一个很简短的问题:

    select provider, value
      from my_table
      where not (provider = '3' and isnew = 0)
      group by provider, value
    

    这是你需要的吗?

        4
  •  0
  •   Michał Turczyn    8 年前

    试试这个:

    select provider,
           [value], 
           isnew
    from (
        select provider,
               [value], 
               isnew,
               row_number() over (partition by Provider order by isnew desc) rn
        from test
    ) a where rn = 1
    

    它只为每一行选择一行 provider ,它也会选择新的,如果有一个感谢 row_number 具有 order by isnew desc

    Demo

        5
  •  0
  •   Saravana Kannadasan    8 年前

    您可以像用户fa06建议的那样使用ROW\u NUMBER()函数。在下面的示例中使用公共表表达式来实现所需的结果

    ;WITH CTE AS
    (
      SELECT Provider, Value, ROW_NUMBER() OVER (PARTITION BY Provider ORDER BY IsNew DESC) 
      AS Row_Rank FROM Test 
    )
    SELECT * FROM CTE WHERE Row_Rank = 1
    

    以下是工作示例: http://sqlfiddle.com/#!18/2e416/19

    如果有帮助请告诉我

        6
  •  0
  •   CrimsonKing    8 年前

    这是我的两分钱:

    SELECT a.Provider, a.Value, a.IsNew
    FROM Table a LEFT JOIN Table b ON a.Provider = b.Provider AND a.IsNew <> b.IsNew
    WHERE a.IsNew = 1 OR b.IsNew IS NULL
    

    Provider Value IsNew
    -------- ----- -----
    1          310     0
    2           25     0
    3          252     1