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