从多个中仅选择1个组

时间:2018-08-27 13:10:33

标签: sql sql-server select group-by

我有桌子

Id | Provider | Value | IsNew

我想从此表中为其选择唯一的ProviderValue

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 个答案:

答案 0 :(得分:1)

您似乎想要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 Fiddle。

答案 1 :(得分:0)

尝试使用row_number:

    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 

答案 2 :(得分:0)

也许我不太了解它,但是对我来说似乎很短:

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

这是您需要的吗?

答案 3 :(得分:0)

您可以使用ROW_NUMBER()函数,就像fa06用户所建议的一样。在下面的示例中使用公共表表达式来达到预期的结果

;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

请告诉我这是否有帮助

答案 4 :(得分:0)

尝试一下:

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只会选择一行,还会选择new。

Demo

答案 5 :(得分:0)

这是我的两分钱

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