获取最终序列的第一行

时间:2016-01-07 12:10:09

标签: sql sql-server

我有一张像这样的桌子

enter image description here

我想获得最终“id”序列的第一个日期(列“dt”)。

根据这个例子,最后的“id”序列是6 我想获得第一次出场的日期“2015-01-04”

6 个答案:

答案 0 :(得分:2)

这有点痛苦。一种使用标准SQL的方法:

select min(t.date)
from t cross join
     (select top 1 id
      from t
      order by date desc
     ) tt
where not exists (select 1
                  from t t2
                  where t2.date >= t.date and t2.id <> tt.id
                 );

另一种方法使用row_number()和观察:如果我们按日期按降序枚举行,并按日期按降序枚举行并按id进行分区,则值相同对于最后一个id序列。我们可以将此作为获得最短日期的条件:

select min(date)
from (select t.*,
             row_number() over (order by date desc) as seqnum,
             row_number() over (partition by id order by date desc) as seqnum_id
      from t
     ) t
where seqnum = seqnum_id;

答案 1 :(得分:1)

SELECT TOP 1 dt FROM 'your Table' WHERE id = 6 ORDER BY dt ASC

或者如果您不知道6是最大值

SELECT TOP 1 dt FROM 'your Table' ORDER BY id DESC, dt ASC

答案 2 :(得分:1)

由于表没有固有顺序,因此“序列”的顺序不明确。如果您使用id + dt,则正确的结果将是2013-01-26而不是2015-01-04,因为它还有id = 6但更早。我假设您实际上已经省略了用于排序的列,可能是主键或其他日期列。

所以假设有一个PK PK_ID

SELECT TOP 1 dt
FROM dbo.TableName t1
WHERE id = (SELECT TOP 1 id 
            FROM dbo.TableName 
            ORDER BY PK_ID DESC)
AND NOT EXISTS
(
    SELECT 1 FROM dbo.TableName t2
    WHERE t2.PK_ID > t1.PK_ID
      AND t2.id   <> t1.id
)
ORDER BY dt ASC

此查询确定子查询中的最后一条记录(根据PK)的ID(优化程序仅执行此操作一次),然后按此ID过滤记录。这将返回id = 6的三个记录。 NOT EXISTS相关子查询将确保以后没有其他记录(根据主要ID)具有不同的ID。这将过滤掉原本可能具有最早日期的第三条记录。 其余两个最后记录按dt排序,TOP 1仅返回最早的2015-01-04

答案 3 :(得分:0)

您可以通过以下查询

执行此操作
SELECT TOP 1 dt
FROM table
ORDER BY id DESC, dt ASC

答案 4 :(得分:0)

这种方法使用了两个ROW_NUMBER,对于第一个具有相同id n 行,它们的增量相似:

SELECT MIN(id), MIN(dt)
FROM
 (
   SELECT
      tab.*,
      ROW_NUMBER () OVER (ORDER BY dt DESC) AS rn,
      ROW_NUMBER () OVER (PARTITION BY id ORDER BY dt DESC) AS rn2
   FROM tab
 ) AS dt
WHERE RN = RN2

答案 5 :(得分:0)

  

我想获得最终“id”序列的第一个日期(列“dt”)。

我想这意味着:找到最大ID(“最终ID”)的最小dt(“第一次约会”):

SELECT MIN(DT) FROM THE_TABLE
    WHERE
        id = (SELECT MAX(id) FROM THE_TABLE)