需要Sql查询解决方案

时间:2018-04-03 10:23:42

标签: sql sql-server sql-server-2008

我有一个以下格式的表格

{{1}}

如果一个特定的ID将其最近的类指示符设为N,则在最近的条目之前搜索它是否为Y,如果是,那么如果不是则应该是该类,那么最近的条目就是答案。

示例:对于ID 1,最近的条目是C,但我们在A处获得了Y,所以我们必须返回A但是在ID 2中,K是最近的条目,我们之前没有任何Y指示符所以我们应该回Y.

2 个答案:

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

但是:
这取决于此查询的结果是否真的是您正在寻找的内容,对我来说仍然不完全清楚