需要Sql查询解决方案

需要Sql查询解决方案,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一张表格,格式如下 ID class indicator 1 A Y 1 B N 1 C(recent) N 2 X N 2 K(recent) N 如果某个特定ID的最近类别指示符为N,则搜索该ID在该最近条目之前是否为Y,如果是,则答案应为该类别,如果不是,则最近条目为答案 例如:对于ID 1,最近的条目是C,但我们在a

我有一张表格,格式如下

ID    class       indicator
1      A              Y
1      B              N 
1      C(recent)      N
2      X              N
2      K(recent)      N
如果某个特定ID的最近类别指示符为N,则搜索该ID在该最近条目之前是否为Y,如果是,则答案应为该类别,如果不是,则最近条目为答案


例如:对于ID 1,最近的条目是C,但我们在a处得到了Y,因此我们必须返回a,但在ID 2中,K是最近的条目,在此之前我们没有任何Y指示符,因此我们应该返回Y。

一种方法是根据此逻辑对每个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

在您对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   
然而:

这取决于此查询的最终结果是否真的是您正在寻找的,我仍然不完全清楚

是否“需要”解决方案,但您发现或尝试了什么?你做了什么样的努力?我认为这不是一个SQL解决方案,你应该认真考虑修改数据结构,因为它不是一个好的。您不应该在类列中包含“最近”。你应该在另一列中使用一些日期列或其他标识符。如果我添加日期而不是类,那么我应该如何继续?@NewBie我不理解这个问题。你能举个例子说明一下吗?为什么你在问题中没有提到这一点?你让我们都在寻找你现在想要的以外的东西