Выберите Top 1 из таблицы для каждого идентификатора в другой таблице - PullRequest
6 голосов
/ 22 февраля 2011

Структура таблицы:

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 с учетом идентификатора плода

Пока у меня есть следующее:

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

Это возвращает все измерения для этого фрукта, я хочу просто вернуть 1 измерение для fruit_allocation.

Ответы [ 4 ]

9 голосов
/ 22 февраля 2011

Вы можете ПРИМЕНИТЬ КРЕСТ

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
1 голос
/ 22 февраля 2011

Предполагается, что вы используете 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
0 голосов
/ 02 октября 2014

выберите * из измерения m, где измерение_дата = (выберите топ 1 измерение_дата из измерения m1, где m1.fruit_allocation_id = m.fruit_allocation_id, порядок по измерению_дата desc) и fruit_allocation_id в (выберите идентификатор из fruit_allocation, где fruit_id = 3)

0 голосов
/ 22 февраля 2011

Создайте подзапрос, чтобы найти последнее измерение для каждого распределения, затем присоединитесь к этому подзапросу, как если бы это была реальная таблица.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...