我有一个数据表(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
Run Code Online (Sandbox Code Playgroud)
我想创建一个返回OrderNO,PartCode和Quantity的查询,但仅用于最后一次注册的订单.
从示例表中我想获得以下信息:
OrderNO PartCode Quantity
2144 44917 100
7235 11762 5
9999 60657 90
Run Code Online (Sandbox Code Playgroud)
请注意,订单9999只返回了一行.
谢谢!
Mik*_*son 166
如果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
Run Code Online (Sandbox Code Playgroud)
Mat*_*lie 55
最好的方法是Mikael Eriksson,如果ROW_NUMBER()可以的话.
根据Cularis的回答,接下来最好是加入查询.
或者,最简单直接的方法是WHERE子句中的相关子查询.
SELECT
*
FROM
yourTable AS [data]
WHERE
DateEntered = (SELECT MAX(DateEntered) FROM yourTable WHERE orderNo = [data].orderNo)
Run Code Online (Sandbox Code Playgroud)
要么...
WHERE
ID = (SELECT TOP 1 ID FROM yourTable WHERE orderNo = [data].orderNo ORDER BY DateEntered DESC)
Run Code Online (Sandbox Code Playgroud)
ton*_*one 27
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))
Run Code Online (Sandbox Code Playgroud)
这是上面提供的所有查询中最快的.查询成本为0.0070668.
上面的首选答案是Mikael Eriksson,查询成本为0.0146625
您可能不关心这么小的样本的性能,但在大型查询中,它们都会增加.
Jac*_*cob 10
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)
Run Code Online (Sandbox Code Playgroud)
内部查询选择OrderNo具有最大日期的所有内容.要获取表格的其他列,您可以加入它们OrderNo和MaxDate.
如果你有索引 ID 和 OrderNo 你可以使用 IN: (我讨厌用简单性来换取晦涩难懂,只是为了节省一些周期):
select * from myTab where ID in(select max(ID) from myTab group by OrderNo);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
339601 次 |
| 最近记录: |