如何从T-SQL表

时间:2015-06-30 16:46:54

标签: sql sql-server-2008 tsql join aggregate-functions

我有一个数据库表,我需要使用视图或存储过程或其他基于实时数据的结果来处理。

该表保存了与每个人相关的数据的人的记录。问题是人们不止一次在桌子上。每条记录显示为个人记录一条或多条信息的时间。

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

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

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

在获取最新信息时,我不需要显示。我只需要显示数据本身。

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

1 个答案:

答案 0 :(得分: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