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

Posted

技术标签:

【中文标题】SQL 查询:如何在排名列值中使用时间戳列【英文标题】:SQL Query :How do I Utilize Timestamp column among rank Column values 【发布时间】:2016-06-21 18:52:12 【问题描述】:

我们正在尝试对 Invoice 列进行排名,并且只想要部分 Invoices 中的第一次发货 Invoices。

也就是说,我们有多个发票列。我们想在包含最早时间戳的排名列中选择那组发票。

时间戳列的性质:

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

提前致谢!

【问题讨论】:

以表定义为起点怎么样?事实上,我们正在猜测您在这里尝试做什么。 spaghettidba.com/2015/04/24/… 实际上,timestamp 数据类型也会在您每次更新记录时发生变化。它意味着通过对记录进行版本控制来解决并发问题。当 2 个进程尝试更改同一记录时,其中一个进程将失败,因为它们的 timestamp 不再与记录中的匹配。 The timestamp column is recorded and incremented each time a record is added - 如果这是您正在寻找的东西,那么您可以识别添加到序列中的第一条记录,您应该添加 identity 列而不是 timestamp 列。这将是 sql server 为每个新记录递增,然后值不会更改。 我们想在发票列值中排名。在这个排名中,想检查哪条记录首先添加,这将是我们的第一批发票。 我已经编辑了问题。其中,包括样本数据、预期数据。 【参考方案1】:

使用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

【讨论】:

当我使用您的查询时。得到这个结果paste.ofcode.org/cKzb6WH3wB2AnMbDjVCYyv 它还告诉我两张多张发票我无法为第一个创建的发票排名。 我的意图是借助 TimeStamp 列。我可以得到一组发票中最早的发票吗 paste.ofcode.org/d9XdFcTtRM5HfkSMArjvEQ我混合了我们两个查询。但在逻辑上仍然无法说服。

以上是关于SQL 查询:如何在排名列值中使用时间戳列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用内容提供程序在 Sqlite 数据库中查询 Android 中的时间戳列?

SQL查询以获取时间戳列中没有小时的数据

使用实体框架按时间戳列选择新记录

查询更新更新列表中未提及的时间戳列

如何将 SQL Server 的时间戳列转换为日期时间格式

在时间戳列上为使用年份函数的查询创建索引