我们正在尝试对“发票”列进行排名,并且只希望在发票的各个部分中首先发货。
就是这样,我们有多个发票。我们希望在排名列中选择由最早时间戳组成的发票组。
TimeStamp专栏的性质:
SQL Server时间戳数据类型与时间或日期无关,它只是一个二进制数来表示序列。每次添加记录时都会记录时间戳列并递增。
我们尝试了以下查询:
select *
from
(select
myrank = rank() over (partition by a.SalesOrder order by c.Invoice),
c.Invoice, c.TimeStamp
from
OrderDetail a
left join
OrderMaster b on a.SalesOrder = b.SalesOrder
left join
InvoiceDetail c on a.SalesOrder = c.SalesOrder
and a.SalesOrderLine = c.SalesOrderLine
where
a.SalesOrder = '218438'
and c.LineType = '1'
and b.OrderStatus = '9' ) z
示例数据:
myrank | SalesOrder | SalesOrderLine |Invoice | TimeStamp
1 218438 8 207964 0x0000000048CD8CD4
2 218438 1 207965 0x0000000048CD8CD5
2 218438 2 207965 0x0000000048CD8CD6
2 218438 3 207965 0x0000000048CD8CD7
2 218438 4 207965 0x0000000048CD8CD8
2 218438 5 207965 0x0000000048CD8CD9
2 218438 6 207965 0x0000000048CD8CDA
2 218438 7 207965 0x0000000048CD8CDB
预期数据:
记录应根据时间戳排名为第一个发货发票和首次添加记录 什么应该输出如果我选择2作为我的等级
myrank | SalesOrder | SalesOrderLine |Invoice | TimeStamp
1 218438 8 207964 0x0000000048CD8CD4
提前致谢!
答案 0 :(得分:0)
使用ROW_NUMBER。
我不知道您的确切表格结构,但它与此类似:
SELECT *
FROM (
SELECT c.Invoice, ROW_NUMBER() OVER (PARTITION BY c.Invoice ORDER BY c.TimeStamp ASC) n
FROM InvoiceDetails c
) i
WHERE i.n = 1