SQL查询:如何在排名列值中使用时间戳列

时间:2016-06-21 18:52:13

标签: sql-server sql-server-2012 analytic-functions

我们正在尝试对“发票”列进行排名,并且只希望在发票的各个部分中首先发货。

就是这样,我们有多个发票。我们希望在排名列中选择由最早时间戳组成的发票组。

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

提前致谢!

1 个答案:

答案 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