我需要为表创建一个select查询,该表将“Number”列中的每个行的行合并,以获得包含所有可用的最新(By ID)列的单行。
这就是我的意思,我需要拿一张这样的表:
ID | Number | Date 1 | Date 2 | Date 3 |
----------------------------------------------------
1 | 1 | 2011-10-01 | NULL | NULL |
2 | 1 | NULL | 2011-10-25 | NULL |
3 | 1 | NULL | NULL | 2011-11-13 |
4 | 1 | 2011-10-03 | NULL | 2011-11-10 |
5 | 2 | NULL | NULL | 2012-01-01 |
6 | 2 | 2012-03-11 | NULL | NULL |
并返回此信息(ID列与上述ID列无关):
ID | Number | Date 1 | Date 2 | Date 3 |
----------------------------------------------------
1 | 1 | 2011-10-03 | 2011-10-25 | 2011-11-10 |
2 | 2 | 2012-03-11 | NULL | 2012-01-01 |
因此对于每个组中的所有行按“数字”列,我需要组中所有行的所有可用列值,但只需要每列的最新值。最新值由“ID”的最高值确定,其中列中的值存在。 (如果组中的任何行上没有列中的值,则使用Null值。)
由于
答案 0 :(得分:1)
您可以使用子查询来选择不同的数字。然后,对于每个数字,您可以在另一个子查询中查找各个列。子查询将查找具有最高ID
的行,其中该特定列不为空。
select yt.Number
, (
select top 1 [Date 1]
from YourTable d1
where d1.Number = yt.Number
and d1.[Date 1] is not null
order by
d1.ID desc
) as [Date 1]
, (
select top 1 [Date 2]
from YourTable d2
where d2.Number = yt.Number
and d2.[Date 2] is not null
order by
d1.ID desc
) as [Date 2]
, ...
from (
select distinct Number
from YourTable
) as yt
答案 1 :(得分:1)
感谢大家的建议。不幸的是,我无法让任何当前的答案对我有用。 不幸的是,我不能依赖日期使用聚合函数,因为它们可能不是最大值或最小值。 每个日期列使用子查询非常聪明,但我无法使查询运行得足够快以供我使用。 (它需要几乎立即运行,但尽管正确配置了索引,但却是在花费大量的时间。)
我提出的解决方案是创建一个具有结构的新表来保存结果,然后使用多个触发器使该表保持最新。有问题的实际表会定期更新,并且表中的插入应该允许我使用触发器保持单独的表更新,从而为我提供我需要的内容。
答案 2 :(得分:0)
这会深化您的数据,您也可以使用聚合函数。*
如果您的数据在其他行中始终具有空值,则聚合函数将忽略它们。这意味着您可以使用GROUP BY获取单行。
SELECT ID, Number, MAX(Date1), MAX(Date2), MAX(Date3)
FROM MyTable
GROUP BY ID, Number
* 注意:这只有在您知道您始终需要MAX(或MIN)值的情况下才有效。在您的问题中,您声明您想要具有最高ID的那个,因此我的解决方案可能无效。