在这样的情况下,我有一个这样的数据集,并且需要在WHERE子句中说一个合并。
要求是过滤是否存在“实际类型”行,过滤掉“期望”类型。请查看下面的数据集,这应该使事情更清楚
表格 父母记录(GUID),类型(文本),日期(日期时间)
实际数据
预期结果
如您所见,如果某行的类型为Active
,则对于特定类型,Draft
将被删除。如果没有带有Active
行的类型,则只需显示Draft
。
有人可以为此提供WHERE子句吗?
答案 0 :(得分:0)
我认为您需要条件排序:
select top (1) with ties t.*
from table t
order by row_number() over (partition by ParentRecord, col
order by (case when Type = 'Active'
then 1
else 2
end)
);
这假设type
列没有您发布的其他数据。
答案 1 :(得分:0)
您要过滤。 。 。但我看不到coalesce()
的位置。做您想要做的一种方法是:
select t.*
from t
where t.type = 'Active'
union all
select t.*
from t
where t.type = 'Draft' and
not exists (select 1 from t t2 where t2.guid = t.guid);
您可以在单个查询中将其表示为:
select t.*
from t
where (t.type = 'Active') or
(t.type = 'Draft' and
not exists (select 1 from t t2 where t2.guid = t.guid)
);
答案 2 :(得分:0)
如果将“活动”和“草稿”状态存储在单独的列中会更简单,因为这样可以避免在“类型”列中使用子字符串。实际上,WHERE子句中没有太多内容。
例如使用临时表:
DECLARE @temp TABLE (GUID int, Type varchar(100), Date datetime)
INSERT INTO @temp VALUES
(100, 'ABC Active', '01/01/2010'), (100, 'ABC Draft', '01/01/2010')
,(100, 'DEF Draft', '01/01/2010'), (100, 'GHI Active', '01/01/2010')
,(100, 'GHI Draft', '01/01/2010'), (100, 'JKL Active', '01/01/2010')
SELECT T.GUID
,COALESCE( (SELECT T2.Type
FROM @temp T2
WHERE T2.GUID = T.GUID
AND T2.Type LIKE '%Active'
AND LEFT(T.Type, 3) = LEFT(T2.Type, 3)
)
, T.Type
) AS [Type]
,T.Date
FROM @temp T
WHERE T.Type LIKE '%Draft'
产生预期的输出:
GUID Type Date
100 ABC Active 2010-01-01 00:00:00.000
100 DEF Draft 2010-01-01 00:00:00.000
100 GHI Active 2010-01-01 00:00:00.000