Tsql 如何按id查找每个列和组的第一条非空记录

Tsql 如何按id查找每个列和组的第一条非空记录,tsql,sequence,Tsql,Sequence,我有一个存储事件的表,我想为每个id创建最新/当前状态的视图。 表中的每一行都应由具有最高对应序列号的非空记录组成。 序列号由事件携带。 我的SQL技能有些生疏,因为我大部分时间都在与Cassandra合作 我花了一整天的时间想办法,并尝试了一些方法,例如使用COALESCE、FIRST\u VALUE和不同的子选择查询。所以我认为我失败的解决方案只会让人困惑,如果贴在这里 以下是包含事件的表: |----|------|------|----------| | Id | A | B

我有一个存储事件的表,我想为每个id创建最新/当前状态的视图。
表中的每一行都应由具有最高对应序列号的非空记录组成。
序列号由事件携带。 我的SQL技能有些生疏,因为我大部分时间都在与Cassandra合作

我花了一整天的时间想办法,并尝试了一些方法,例如使用
COALESCE
FIRST\u VALUE
和不同的子选择查询。所以我认为我失败的解决方案只会让人困惑,如果贴在这里

以下是包含事件的表:

|----|------|------|----------|
| Id | A    | B    | Sequence |
|----|------|------|----------|
| 1  | a0   | b0   | 0        |
|----|------|------|----------|
| 2  | a0   | b6   | 0        |
|----|------|------|----------|
| 1  | a1   | NULL | 1        |
|----|------|------|----------|
| 2  | a1   | NULL | 1        |
|----|------|------|----------|
| 2  | NULL | b2   | 2        |
|----|------|------|----------|
| 2  | a3   | b3   | 3        |
|----|------|------|----------|
| 2  | NULL | b4   | 4        |
|----|------|------|----------|
。。。以及a希望实现的观点:

|----|----|----|----------|
| Id | A  | B  | Sequence |
|----|----|----|----------|
| 1  | a1 | b0 | 1        |
|----|----|----|----------|
| 2  | a3 | b4 | 4        |
|----|----|----|----------|

一个简单的解决方案是使用好的老式子查询

首先,创建并填充样本表(请在以后的问题中保存此步骤):

查询:

SELECT  Id, 
        (
            -- get the last non-null A value for the specified Id
            SELECT TOP 1 A 
            FROM @T As T1
            WHERE T1.Id = T0.Id
            AND A IS NOT NULL
            ORDER BY Sequence DESC
        ) As A,
        (
            -- get the last non-null B value for the specified Id
            SELECT TOP 1 B 
            FROM @T As T1
            WHERE T1.Id = T0.Id
            AND B IS NOT NULL
            ORDER BY Sequence DESC
        ) As B,
        MAX(Sequence) As Sequence
FROM @T As T0
GROUP BY Id
结果:

Id  A   B   Sequence
1   a1  b0  1
2   a3  b4  4

如果你继续推动,结果就会出现:-)我设法弄明白了。对于任何感兴趣的人,以下是代码:

SELECT [id],
       [A] = (
           SELECT TOP (1) [A]
           FROM [dbo].[Table]
           WHERE [A] IS NOT NULL
               AND [Current].[Id] = [Id]
           ORDER BY [Sequence] DESC
       ),
       [B] = (
           SELECT TOP (1) [B]
           FROM [dbo].[Table]
           WHERE [B] IS NOT NULL
               AND [Current].[Id] = [Id]
           ORDER BY [Sequence] DESC
       ),
       [HighestSequence] = (
           SELECT TOP (1) [Sequence]
           FROM [dbo].[Table]
           WHERE [Current].[Id] = [Id]
           ORDER BY [Sequence] DESC
       )
FROM (SELECT [Id] FROM [dbo].[Table]) AS [Current]
GROUP BY [Id]
我不知道查询将如何执行,但在我的场景中,它将是合适的。
如果您发现任何缺陷,请告诉我。改进总是受欢迎的。

谢谢你,伙计!我想我们是在同一时间发布的:)我会给你信用。我会记得在将来创建并填充一个示例表。很高兴为您提供帮助:-)
SELECT [id],
       [A] = (
           SELECT TOP (1) [A]
           FROM [dbo].[Table]
           WHERE [A] IS NOT NULL
               AND [Current].[Id] = [Id]
           ORDER BY [Sequence] DESC
       ),
       [B] = (
           SELECT TOP (1) [B]
           FROM [dbo].[Table]
           WHERE [B] IS NOT NULL
               AND [Current].[Id] = [Id]
           ORDER BY [Sequence] DESC
       ),
       [HighestSequence] = (
           SELECT TOP (1) [Sequence]
           FROM [dbo].[Table]
           WHERE [Current].[Id] = [Id]
           ORDER BY [Sequence] DESC
       )
FROM (SELECT [Id] FROM [dbo].[Table]) AS [Current]
GROUP BY [Id]