SQL-запрос для определения статуса последнего события заказа - PullRequest
2 голосов
/ 02 марта 2011

У меня есть две таблицы (в базе данных SQL Server):

TblOrders
OrderID (PK)
(еще несколько полей)

TblEvents
EventID (PK)
OrderID (FK) (связан с OrderID TblOrders)
EventDate
Статус

Каждыйсобытие в TblEvents принадлежит заказу в TblOrders, и каждое событие имеет дату и «статус» (числовой код).У ордера может быть несколько событий (хотя бы одно).

Мне нужен запрос SQL, который находит для каждого OrderID в TblOrders статус события latest среди всех его событий.Например:

Входные таблицы:

TblOrders  
=========
 OrderID
       1
       2
       3

TblEvents  
=========
 EventID OrderID EventDate  Status  
       1       1 01/02/2011      4
       2       1 02/02/2011      2
       3       2 03/02/2011      2
       4       3 03/02/2011      3
       5       2 01/02/2011      1

Результат запроса:

OrderID Status
      1      2
      2      2
      3      3

(OrderID 2 имеет статус 2, поскольку имеет два события: 3 и 5и последним из них является Событие 3 со статусом 2.)

Надеюсь, я четко объяснил.Я пытался написать запрос в течение долгого времени, но не смог найти решение, поэтому любая помощь или подсказка будут приветствоваться.

Ответы [ 6 ]

3 голосов
/ 02 марта 2011
select a.OrderID, e.Status
from (
   select o.OrderID, max(e.EventDate) latestDate
   from TblOrders o
   inner join TblEvents e on o.OrderID = e.OrderID
   group by o.OrderID
   ) a
inner join TblEvents e on e.OrderID = a.OrderID
where e.EventDate = a.latestDate
0 голосов
/ 18 апреля 2018
Select * from TblEvents Where EventID IN(
  Select MAX(EventID) from TblEvents Group by OrderID
)
  • Присоединяйтесь к любой таблице, которую хотите
0 голосов
/ 02 марта 2011
SELECT q.OrderID, q.Status
    FROM (SELECT e.OrderID, e.Status, 
                 ROW_NUMBER() OVER (PARTITION BY e.OrderID ORDER BY EventDate DESC) as RowNum)
              FROM tblEvents e) q
    WHERE q.RowNum = 1

Тот же запрос с использованием CTE :

;WITH cteRowNum AS (
    SELECT e.OrderID, e.Status, 
           ROW_NUMBER() OVER (PARTITION BY e.OrderID ORDER BY EventDate DESC) as RowNum
        FROM tblEvents e
)
SELECT q.OrderID, q.Status
    FROM cteRowNum q
    WHERE q.RowNum = 1
0 голосов
/ 02 марта 2011
select a.OrderID, a.Status
from TblEvents a
where a.EventDate =
 (select max(b.EventDate)
  from TblEvents b
  where b.OrderId = a.OrderID)

Обратите внимание, что это вернет несколько строк, если более одной записи для Ордера имеет одинаковую последнюю дату EventDate.

0 голосов
/ 02 марта 2011

Попробуйте это ...

SELECT DISTINCT(OrderId) OrderId, Status 
FROM tblEvents   
ORDER BY EventDate
0 голосов
/ 02 марта 2011

ВЫБРАТЬ TblORDER.ORDERID, МАКС. (TblEvent.EventDate), tblEvent.Status ИЗ TblOrder INNER Присоединиться к tblEvent ON tblEvent.OrderID = tbOrder.ORDERID GROUP BY TblORDER.ORDERID ... что-то подобное? * 100

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...