[sql-server] SQL Server : MAX (DATE)가있는 행만 선택

데이터 테이블이 있습니다 (db는 MSSQL입니다).

    ID  OrderNO PartCode  Quantity DateEntered
    417 2144     44917    100      18-08-11
    418 7235     11762    5        18-08-11
    419 9999     60657    100      18-08-11
    420 9999     60657    90       19-08-11

OrderNO, PartCode 및 Quantity를 반환하는 쿼리를 만들고 싶지만 마지막으로 등록 된 주문에 대해서만.

예제 테이블에서 다음 정보를 얻고 싶습니다.

     OrderNO PartCode  Quantity
     2144     44917    100
     7235     11762    5
     9999     60657    90      

주문 9999에 대해 하나의 라인 만 반품되었습니다.

감사!



답변

가능하다면 rownumber() over(...)….

select OrderNO,
       PartCode,
       Quantity
from (select OrderNO,
             PartCode,
             Quantity,
             row_number() over(partition by OrderNO order by DateEntered desc) as rn
      from YourTable) as T
where rn = 1      


답변

ROW_NUMBER()가능한 경우 가장 좋은 방법은 Mikael Eriksson 입니다.

차선책은 Cularis의 답변에 따라 쿼리에 참여하는 것입니다.

또는 가장 간단하고 직접적인 방법은 WHERE 절의 상관 하위 쿼리입니다.

SELECT
  *
FROM
  yourTable AS [data]
WHERE
  DateEntered = (SELECT MAX(DateEntered) FROM yourTable WHERE orderNo = [data].orderNo)

또는…

WHERE
  ID = (SELECT TOP 1 ID FROM yourTable WHERE orderNo = [data].orderNo ORDER BY DateEntered DESC)


답변

select OrderNo,PartCode,Quantity
from dbo.Test t1
WHERE EXISTS(SELECT 1
         FROM dbo.Test t2
         WHERE t2.OrderNo = t1.OrderNo
           AND t2.PartCode = t1.PartCode
         GROUP BY t2.OrderNo,
                  t2.PartCode
         HAVING t1.DateEntered = MAX(t2.DateEntered))

이것은 위에 제공된 모든 쿼리 중 가장 빠릅니다. 쿼리 비용은 0.0070668입니다.

Mikael Eriksson이 작성한 위의 기본 답변은 쿼리 비용이 0.0146625입니다.

이러한 작은 샘플의 성능에 관심이 없을 수도 있지만 큰 쿼리에서는 모두 합산됩니다.


답변

SELECT t1.OrderNo, t1.PartCode, t1.Quantity
FROM table AS t1
INNER JOIN (SELECT OrderNo, MAX(DateEntered) AS MaxDate
            FROM table
            GROUP BY OrderNo) AS t2
ON (t1.OrderNo = t2.OrderNo AND t1.DateEntered = t2.MaxDate)

내부 쿼리는 OrderNo최대 날짜로 모두 선택합니다 . 테이블의 다른 열을 얻으려면, 당신은 그들에 가입 할 수 있습니다 OrderNoMaxDate.


답변

MySql의 경우 다음과 같은 작업을 수행 할 수 있습니다.

select OrderNO, PartCode, Quantity from table a
join (select ID, MAX(DateEntered) from table group by OrderNO) b on a.ID = b.ID


답변

그리고 u는 해당 select 문을 왼쪽 조인 쿼리로 사용할 수도 있습니다. 예 :

... left join (select OrderNO,
   PartCode,
   Quantity from (select OrderNO,
         PartCode,
         Quantity,
         row_number() over(partition by OrderNO order by DateEntered desc) as rn
  from YourTable) as T where rn = 1 ) RESULT on ....

이것이 이것을 찾는 누군가를 돕기를 바랍니다 🙂


답변

rownumber () over (…)는 작동하지만 두 가지 이유로이 솔루션이 마음에 들지 않았습니다. -SQL2000과 같은 이전 버전의 SQL을 사용하는 경우에는이 기능을 사용할 수 없습니다.

또 다른 해결책은 다음과 같습니다.

SELECT tmpall.[OrderNO] ,
       tmpall.[PartCode] ,
       tmpall.[Quantity] ,
FROM   (SELECT [OrderNO],
               [PartCode],
               [Quantity],
               [DateEntered]
        FROM   you_table) AS tmpall
       INNER JOIN (SELECT [OrderNO],
                          Max([DateEntered]) AS _max_date
                   FROM   your_table
                   GROUP  BY OrderNO ) AS tmplast
               ON tmpall.[OrderNO] = tmplast.[OrderNO]
                  AND tmpall.[DateEntered] = tmplast._max_date