在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]就很简单了。