Выберите Top 1 из таблицы для каждого идентификатора в другой таблице

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

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.

Вы можете использовать CROSS APPLY

 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 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 

выберите * из измерения m, где measure_date = (выберите top 1 measure_date из измерения m1, где m1.fruit_allocation_id = m.fruit_allocation_id order by measure_date desc) И fruit_allocation_id in (выберите id из fruit_allocation где fruit_id = 3)

Interesting Posts

SQL Server: выберите из exec, используя строки

Как перенести данные из одной таблицы в другую 2 таблицы

SQL Server Vs MongoDB: Тест скорости?

Ошибка при вычитании столбцов в SQL

Создание типа структуры в качестве значения столбца для T-SQL?

Можете ли вы настроить аудит SQL Server 2008 для хранения данных аудита в базе данных, отличной от проверяемой?

Запрос Sql для генерации ежемесячных дат оплаты в диапазоне дат

Произошла ошибка базы данных (ошибка SQL Server 18054) при сопоставлении локального каталога в TFS

C # Excel Ссылка на объект не установлена ​​в экземпляр объекта

Сценарий установки / обновления T-SQL как транзакция

Скрипт для синхронизации подписчиков

Как я могу использовать оператор LIKE для выполнения этого соответствия в SQL Server?

Как вы PIVOT по битовому типу данных в SQL Server?

Почему класс серьезности SqlException отличается от того, что spec говорит, что это должно быть?

Почему LINK не поддерживает простые внешние соединения (с учетом предложения where на внешней объединенной таблице)?

Давайте будем гением компьютера.