在SQL中检索上次发票价格
我知道这对你们大多数人来说都很简单 我有这样一个发票表:在SQL中检索上次发票价格,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我知道这对你们大多数人来说都很简单 我有这样一个发票表: +-----------+------------+------+-------+ | InvoiceID | Date | Item | Price | +-----------+------------+------+-------+ | 1 | 15/04/2014 | A | 12 | | 2 | 20/04/2014 | A | 20 | | 3
+-----------+------------+------+-------+
| InvoiceID | Date | Item | Price |
+-----------+------------+------+-------+
| 1 | 15/04/2014 | A | 12 |
| 2 | 20/04/2014 | A | 20 |
| 3 | 20/04/2014 | A | 27 |
| 4 | 20/04/2014 | B | 29 |
| 5 | 28/04/2014 | C | 16 |
| 6 | 28/04/2014 | B | 11 |
+-----------+------------+------+-------+
我想根据每个项目的最后一个发票ID检索价格,因此:
+------+-----------+
| Item | LastPrice |
+------+-----------+
| A | 27 |
| B | 11 |
| C | 16 |
+------+-----------+
最有效的方法是什么?我正在使用SQLServer2008
非常感谢收到的任何帮助。这可能会完成您的工作:
with cte as (
select *, row_number() over (partition by Item order by date desc) as r
from dbo.YourTable
)
select * from cte where r = 1
SELECT Item,
Price AS 'LastPrice'
FROM MyTable
WHERE InvoiceId IN (SELECT Max(InvoiceId)
FROM MyTable
GROUP BY Item)
这可以完成您的工作:
SELECT Item,
Price AS 'LastPrice'
FROM MyTable
WHERE InvoiceId IN (SELECT Max(InvoiceId)
FROM MyTable
GROUP BY Item)
它不应该是按invoiceid desc排序的吗?可能会将invoiceid desc添加为一个平局破坏者。我并不特别喜欢更高的发票意味着更晚。如果发票上的日期后来调整了怎么办?@AD.Net:这取决于您对最新日期的定义。我看到了一个暂时的值,就这么做了。幸运的是,如果将[Date]更改为[InvoiceId],这是一个更好的衡量哪张发票先到的方法,那么将[Date]更改为[InvoiceId]就很简单了。它不应该是按InvoiceId描述订购的吗?可能会将InvoiceId描述添加为平局打破者。我并不特别喜欢更高的发票意味着更晚。如果发票上的日期后来调整了怎么办?@AD.Net:这取决于您对最新日期的定义。我看到了一个暂时的值,就这么做了。幸运的是,如果将[Date]更改为[InvoiceId]可以更好地衡量哪张发票先到,那么将其更改为[InvoiceId]就很简单了。