我有一个以下格式的表格
{{1}}
如果一个特定的ID将其最近的类指示符设为N,则在最近的条目之前搜索它是否为Y,如果是,那么如果不是则应该是该类,那么最近的条目就是答案。
示例:对于ID 1,最近的条目是C,但我们在A处获得了Y,所以我们必须返回A但是在ID 2中,K是最近的条目,我们之前没有任何Y指示符所以我们应该回Y.
答案 0 :(得分:1)
一种方法是根据此逻辑对每个ID的条目进行排序,使用row_number()
为每个ID分配一个数字,然后只取第一个:
SELECT id, class, indicator
FROM (SELECT id, class, indicator,
ROW_NUMBER() OVER (PARTITION BY id
ORDER BY indicator DESC,
CASE WHEN class LIKE '%(recent)' THEN 0
ELSE 1
END ASC) AS rn
FROM mytable) t
WHERE rn = 1
答案 1 :(得分:1)
在您对Mureinik的回答中,您提到要在类列中使用datetime列而不是recent
。
执行此操作的一种方法如下所示,但如果您有很多记录
,则效果不佳 在这种情况下,你的桌子看起来有时像这样:ID Class Indicator IndicatorDate
-- ----- --------- -------------
1 A Y 31/03/2018 12:59:18
1 B N 1/04/2018 12:59:18
1 C N 3/04/2018 12:59:18
2 X N 3/04/2018 12:59:18
2 K N 2/04/2018 12:59:18
可能的解决方案是
declare @table table (ID int, Class varchar(1), Indicator varchar(1), IndicatorDate datetime)
insert into @Table(ID, Class, Indicator, IndicatorDate)
values (1, 'A', 'Y', getdate() - 3), (1, 'B', 'N', getdate() - 2), (1, 'C', 'N', getdate()), (2, 'X', 'N', getdate()), (2, 'K', 'N', getdate() - 1)
select td.ID,
(select top 1 t2.Class from @table t2 where t2.ID = td.ID order by t2.Indicator desc, t2.IndicatorDate desc) as selectedClass,
(select top 1 t2.Indicator from @table t2 where t2.ID = td.ID order by t2.Indicator desc, t2.IndicatorDate desc) as selectedIndicator
from
( select distinct t.ID
from @table t
) td
将返回此
ID selectedClass selectedIndicator
-- ------------- -----------------
1 A Y
2 X N
但是:
这取决于此查询的结果是否真的是您正在寻找的内容,对我来说仍然不完全清楚