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입니다.
You may not care about the performance for such a small sample, but in large queries, it all adds up.
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)
The inner query selects all OrderNo
with their maximum date. To get the other columns of the table, you can join them on OrderNo
and the MaxDate
.
If you have indexed ID and OrderNo You can use IN: (I hate trading simplicity for obscurity, just to save some cycles):
select * from myTab where ID in(select max(ID) from myTab group by OrderNo);
For MySql you can do something like the following:
select OrderNO, PartCode, Quantity from table a
join (select ID, MAX(DateEntered) from table group by OrderNO) b on a.ID = b.ID
And u can also use that select statement as left join query... Example :
... 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 ....
Hope this help someone that search for this :)
rownumber() over(...) is working but I didn't like this solution for 2 reasons. - This function is not available when you using older version of SQL like SQL2000 - Dependency on function and is not really readable.
Another solution is:
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
Try to avoid IN use JOIN
SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT msisdn, callid, Change_color, play_file_name, date_played FROM insert_log
WHERE play_file_name NOT IN('Prompt1','Conclusion_Prompt_1','silent')
ORDER BY callid ASC) t1 JOIN (SELECT MAX(date_played) AS date_played FROM insert_log GROUP BY callid) t2 ON t1.date_played=t2.date_played
참고URL : https://stackoverflow.com/questions/7118170/sql-server-select-only-the-rows-with-maxdate
'Programing' 카테고리의 다른 글
Android Studio 이미지 자산 실행기 아이콘 배경색 (0) | 2020.08.29 |
---|---|
명령 줄에서 현재 디렉토리 제공 (0) | 2020.08.29 |
csv 파일의 한 열을 추출하는 방법 (0) | 2020.08.29 |
reactJS에서 텍스트를 클립 보드에 복사하는 방법은 무엇입니까? (0) | 2020.08.29 |
목록을 정렬하는 방법 (0) | 2020.08.29 |