2016-07-11 5 views
0

В настоящее время у меня есть хранимая процедура, которая возвращает данные из таблицы базы данных, заполненной из API. Текущий запрос:Выберите новый, а не отдельный

Select * 
From Inventory 
where StockNumber in (select distinct stocknumber) 
order by Make 

Вместо этого я на самом деле нужно взять верхние 1 новейший рекорд, основанный на DateTimeStamp колонке, как часто есть много записей с одинаковым stocknumber, но разными метками времени.

+0

' ORDER BY DateTimeStamp DESC LIMIT 1'? –

+0

Какую версию SQL вы используете (например, MySQL, SQL Server)? –

+0

Sql Server Последняя версия – JKerny

ответ

1

Один из способов заключается в использовании коррелированный подзапрос:

Select i.* 
From Inventory i 
where i.datetime in (select max(i2.datetime) 
        from Inventory i2 
        where i2.stocknumber = i.stocknumber 
        ) 
order by i.Make; 

Другой способ состоит в использовании функции стандартного окна ANSI row_number():

select i.* 
from (select i.*, 
      row_number() over (partition by stocknumber order by datetime desc) as seqnum 
     from Inventory i 
    ) i 
where seqnum = 1; 
0

Используйте INNER JOIN раздел:

Select t1.* From Inventory t1 
INNER JOIN (SELECT StockNumber, MAX(Make) AS Make FROM Inventory GROUP BY StockNumber) t2 
ON t1.StockNumber = t2.StockNumber AND t1.Make = t2.Make 
+0

Что делать, если есть несколько t1.Make = t2.Make? – StanislavL

+0

Поскольку вы используете max() и группу по t2 (подзапрос, который по ошибке указан выше t1), он только вернет 1 строку. Если есть несколько t1, у вас будет запись t2, повторяющаяся для каждого из них. – LordBaconPants

+0

@StanislavL Если существует, то он должен решить, какой из них зарезервирован. Поэтому в этом состоянии, возможно, должны существовать другие критерии «JOIN». – Blank

Смежные вопросы