DENSE_RANK() OVER(按 UniqueIdentifer 排序)问题

DENSE_RANK() OVER (Order by UniqueIdentifer) issue

我正在努力让 DENSE_RANK 做我想让它做的事。

基本上就是根据唯一标识创建一个唯一的发票编号,但是需要根据发票的date/time依次上去。

例如我需要:

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

但是我在使用 DENSE_RANK OVER (Order by TxnId) 时得到的是:

InvoiceNo       TxnId                                 TxnDate
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:02
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:01
    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:06
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:05
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    02/01/2014 00:08
    1       6C952E91-B888-4244-9079-14FBECAE0BA2    01/01/2014 00:07
    2       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:10
    2       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:21
    2       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:20
    2       83168B53-1647-4EB9-AF17-0B285EAA69B4    03/03/2014 00:23
    3       8A5BCC36-8A70-4BE1-9FAB-A33BDD5BB78F    02/02/2014 00:09
    3       8A5BCC36-8A70-4BE1-9FAB-A33BDD5BB78F    02/02/2014 00:09

如果我做 DENSE_RANK OVER(TxnId,TxnDate),那将是一团糟,也不会做我想做的事情。

有什么想法吗?我什至使用写函数来做到这一点吗?任何帮助表示赞赏:)

我想你想要:

select dense_rank() over (order by txnid, txndate)

具有相同交易 ID 日期的所有内容都将具有相同的值。

编辑:

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

select dense_rank() over (order by txnid, trunc(txndate))

对于 Postgres:

select dense_rank() over (order by txnid, date_trunc('day', txndate))

对于 SQL 服务器:

select dense_rank() over (order by txnid, cast(txndate as date))

编辑二:

您希望交易按最早日期排序。获取最早的日期,然后执行 dense_rank():

select dense_rank() over (order by txnmindate, txnid)
from (select t.*, min(txndate) over (partition by txnid) as txnmindate
      from table t
     ) t