繁体   English   中英

从另一个表中的每个ID的表中选择前1

[英]Select Top 1 From a Table For Each Id in another Table

表结构是:

create table fruit (
  id int identity(1,1),
  name varchar(max)
)

create table fruit_allocation (
  id int identity(1,1),
  fruit_id int references fruit(id),
  customer_id int references store(id),
  amount float,
)

create table measurement (
  fruit_allocation_id int references fruit_allocation(id),
  measurement_date datetime,
  measurement float,
)

每个水果都可以分配给多个客户,创建一个fruit_allocation记录。 每个fruit_allocation记录可以有多个度量。

我想为每个fruit_allocation选择最新的度量给出一个水果ID

到目前为止,我有以下内容:

select * 
  from measurement 
 where fruit_allocation_id in (select id 
                                 from fruit_allocation 
                                where fruit_id = 10)

这将返回该水果的所有测量值,我想每个fruit_allocation返回1个测量值。

你可以交叉申请

select a.*, m.*
from fruit_allocation a
cross apply (
    select top 1 *
    from measurement m
    where m.fruit_allocation_id = a.id
    order by m.measurement_date desc
) m
where a.fruit_id = 10

假设您使用的是SQL Server 2005+

With RankedMeasurements As
    (
    Select M.fruit_allocation_id
        , M.measurement_date
        , M.measurement
        , Row_Number() Over ( Partition By M.fruit_allocation_id 
                                Order By M.measurement_date Desc ) As Rnk
    From measurement As M
    Where Exists    (
                    Select 1
                    From fruit_allocation As FA1
                    Where FA1.id = M.fruit_allocation_id
                        And FA1.fruit_id = 10
                    )   
    )
Select RM.fruit_allocation_id
    , RM.measurement_date
    , RM.measurement
From RankedMeasurements As RM
Where Rnk = 1

select * from measurement m,其中measurement_date =(从测量m1中选择top1 measurement_date,其中m1.fruit_allocation_id = m.fruit_allocation_id order by measurement_date desc)和fruit_allocation_id in(从fruit_allocation中选择id,其中fruit_id = 3)

创建一个子查询以查找每个分配的最新度量,然后加入该子查询,就像它是一个真实的表一样。

select * from measurement meas
join
        (
        SELECT  fruit_allocation_id,
                MAX(measurement_date) as max_date
        FROM    measurement meas2
        JOIN    fruit_allocation alloc
        ON      alloc.id = meas2.fruit_allocation_id
        where fruit_id = 10
        ) max_meas
on      meas.fruit_allocation_id = max_mes.fruit_allocation_id
and     meas.measurement_date = max_meas.max_date

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM