我有一张像这样的桌子
我想获得最终“id”序列的第一个日期(列“dt”)。
根据这个例子,最后的“id”序列是6 我想获得第一次出场的日期“2015-01-04”
答案 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)