我有桌子
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
在实际示例中查询要复杂得多,希望我能解释一下。
答案 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。
答案 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