Sql (按唯一标识符排序)问题上的稠密秩()

Sql (按唯一标识符排序)问题上的稠密秩(),sql,sql-server,dense-rank,sql-order-by,Sql,Sql Server,Dense Rank,Sql Order By,我正在努力让它做我想做的事情 它基本上是基于唯一标识符创建唯一的发票编号,但它需要根据发票的日期/时间按顺序递增 例如,我需要: InvoiceNo TxnId TxnDate 1 6C952E91-B888-4244-9079-14FBECAE0BA2 01/01/2014 00:01 1 6C952E91-B888-4244-9079-14FBECAE0BA2 01/

我正在努力让它做我想做的事情

它基本上是基于唯一标识符创建唯一的发票编号,但它需要根据发票的日期/时间按顺序递增

例如,我需要:

InvoiceNo                  TxnId                     TxnDate
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:01
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:02
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:03
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:04
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:05
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:06
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:07
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    02/01/2014 00:08
    2       8A5BCC36-8A70-4BE1-9FAB-A33BDD5BB78F    02/02/2014 00:09
    2       8A5BCC36-8A70-4BE1-9FAB-A33BDD5BB78F    02/02/2014 00:09
    3       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:10
    3       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:20
    3       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:21
    3       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:23
但我在使用密集秩覆盖(TxnId排序)时得到的结果是:

如果我做了密集排列(TxnId,TxnDate),这是一个完全的混乱,也没有做我想要的

有什么想法吗,伙计们?我甚至用写函数来做这件事吗?感谢您的帮助:)

我想您需要:

select dense_rank() over (order by txnid, txndate)
具有相同事务id和日期的所有内容都将具有相同的值

编辑:

如果需要提取日期,则这取决于数据库。它看起来像这样。对于Oracle:

select dense_rank() over (order by txnid, trunc(txndate))
对于博士后:

select dense_rank() over (order by txnid, date_trunc('day', txndate))
对于SQL Server:

select dense_rank() over (order by txnid, cast(txndate as date))
编辑二:

您希望按最早的日期订购交易。获取最早的日期,然后执行
密集排序()


你想用
行编号
而不是
密集排列
吗?不,行编号会对发票编号执行1,2,3,4,5,6,7操作,无论发票如何,我需要每个TxnId有一个唯一的发票编号,但按日期排序。不,你可以使用
行编号()覆盖(按TxnId顺序按TXNADE划分)
这就是我所做的。然后根据同一TxnId的实例数量进行统计。i、 e.如果同一交易ID有3个实例,则每个实例都有一个唯一的编号,这是不正确的。TxnId需要唯一,因此1 TxnId=1个发票号。由于TxnId每行的日期不同,因此没有密集的(TxnId、TxnDate的订单)不起作用。我会编辑原稿来显示这一点。这似乎没有任何区别,如果有一个事务滚动到第二天,它也不会工作。顺便说一下,正在使用SQL Server。@Adam'Yoko'Chapman。这回答了您提出的问题。如果您有不同的问题,例如跨多天的交易和确定是否获得新发票id的规则,请询问另一个问题,并提供适当的详细信息。指定的示例在第一个TxnId上跨多天,但可能不太清楚。
select dense_rank() over (order by txnid, cast(txndate as date))
select dense_rank() over (order by txnmindate, txnid)
from (select t.*, min(txndate) over (partition by txnid) as txnmindate
      from table t
     ) t