如何从 T-SQL 表中提取最新值

Posted

技术标签:

【中文标题】如何从 T-SQL 表中提取最新值【英文标题】:How to pull the most recent values from a T-SQL table 【发布时间】:2015-09-17 14:00:56 【问题描述】:

我有一个数据库表,我需要使用视图或存储过程或其他可以根据实时数据为我提供结果的东西进行处理。

该表包含与每个人相关联的数据的人员记录。问题是人们可以不止一次在桌子上。每条记录都显示为个人记录一条或多条信息的时间。

人员的标识符字段是 cardholder_index。我需要获取该字段的 DISTINCT 列表。还有一个名为 bio_complete_date 的日期字段。我需要做的是,对于表中的所有其他字段,取最近的非空(或可能非零)值。

例如,有一个 bmi 字段。对于每个不同的持卡人索引,我需要获取该持卡人索引的最新(通过 bio_complete_date 字段)非空 bmi。但是还有一个 body_fat 字段,我需要在该字段中取最近的非空值,它可能不一定与最近的非空 bmi 值在同一行。

作为记录,表本身确实有自己的唯一标识符列 bio_id,如果有帮助的话。

我不需要显示何时最近的一条信息是被获取的。我只需要展示数据本身。

我想我需要在 card_holder 索引上做一个 distinct,然后将每个其他字段的查询结果集加入它。它正在编写给我带来问题的子查询。

【问题讨论】:

您自己尝试过什么吗?此外,向我们展示一些示例数据以及所需的输出也会很有帮助。 有没有例子,表名、字段名、where子句等? 用文字解释就好,但需要提供样本数据和样本输出。请记住,我们面前没有数据。如果不能共享实际数据,则生成一些与实际表匹配的虚拟数据。 或者说具体一点,你最后一句话提到的问题是什么? 【参考方案1】:

根据您的描述,我猜您的表格如下所示:

create table people (
    bio_id int identity(1,1), 
    cardholder_index int, 
    bio_complete_date date, 
    bmi int, 
    body_fat int
)

如果是这样,进行查询的一种(多种)方法是使用相关查询来提取 cardholder_index 的最新非空值,或者使用如下子查询:

select 
    cardholder_index, 
    (
       select top 1 bmi 
       from people 
       where cardholder_index = p.cardholder_index and bmi is not null 
       order by bio_complete_date desc
    ) as latest_bmi, 
    (
       select top 1 body_fat 
       from people 
       where cardholder_index = p.cardholder_index and body_fat is not null 
       order by bio_complete_date desc
    ) as latest_body_fat
from people p
group by cardholder_index

或者像这样使用apply 运算符:

select cardholder_index, latest_bmi.bmi, latest_body_fat.body_fat
from people p
outer apply (
    select top 1 bmi 
    from people 
    where cardholder_index = p.cardholder_index and bmi is not null 
    order by bio_complete_date desc
) as latest_bmi
outer apply (
    select top 1 body_fat 
    from people 
    where cardholder_index = p.cardholder_index and body_fat is not null 
    order by bio_complete_date desc
) as latest_body_fat
group by cardholder_index, latest_bmi.bmi, latest_body_fat.body_fat

Sample SQL Fiddle demo

【讨论】:

我以前从未听说过 apply 运算符,但它似乎正是我正在寻找的。你的两个答案都有效。我会继续做整个表,看看哪个跑得更快。谢谢! @Hypersapien Apply 非常有用——尽管这个查询可能不是最好的情况;第一个查询应该更快。两者都应该受益于cardholder_index, bio_complete_date desc的人员索引 我尝试将其转换为视图,但它不允许我向具有子查询或使用 APPLY 的视图添加索引。 @Hypersapien 哦。不过,您应该能够将索引添加到基础表中,但是如果您的数据集不是很大,那么索引的存在可能并不重要。 哦!这就是你的意思。它已经有一个关于 bio_id 的索引。我写的查询仍然需要大约 20 秒才能使用任何一种方法运行。 Boss 决定接受查询并将其转换为存储过程,我们将 cardholder_index 传递到其中,这样我们就可以一次调用一个人的信息,这样效果很好。

以上是关于如何从 T-SQL 表中提取最新值的主要内容,如果未能解决你的问题,请参考以下文章

如何从Oracle SQL中的2个表中提取每个ID的最新记录[重复]

T-SQL:如何在值列表中选择不在表中的值?

如何从表中提取行,用不同的值过滤同一列?

如何从 T-SQL 中的表中选择前 N 行?

努力从 XML 数据中提取值 (T-SQL)

如何从T-SQL中的排序表中从第M行开始获取N行