데이터 테이블이 있습니다 (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
최대 날짜로 모두 선택합니다 . 테이블의 다른 열을 얻으려면, 당신은 그들에 가입 할 수 있습니다 OrderNo
와 MaxDate
.
답변
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