我有一个数据库表,我需要使用视图或存储过程或其他基于实时数据的结果来处理。
该表保存了与每个人相关的数据的人的记录。问题是人们不止一次在桌子上。每条记录显示为个人记录一条或多条信息的时间。
人员的标识符字段是cardholder_index。我需要获取该字段的DISTINCT列表。还有一个名为bio_complete_date的日期字段。我需要做的是,对于表中的所有其他字段,采用最近的非空(或可能非零)值。
例如,有一个bmi字段。对于每个不同的持卡人索引,我需要为该cardholder_index采用最新的(通过bio_complete_date字段)非null bmi。但是还有一个body_fat字段,我需要在该字段中取最近的非空值,这可能不一定是与最近的非空bmi值相同的行。
对于记录,表本身确实有自己唯一的标识符列bio_id,如果有帮助的话。
在获取最新信息时,我不需要显示。我只需要显示数据本身。
我想我需要在card_holder索引上做一个明确的,然后为每个其他字段加入查询的结果集。它正在编写给我带来问题的子查询。
答案 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