DENSE_RANK()OVER(由UniqueIdentifier排序)问题

时间:2015-01-28 12:12:08

标签: sql sql-server dense-rank sql-order-by

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

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

例如我需要:

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(按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),那就完全搞乱了,并没有做我想做的事。

任何想法的家伙?我甚至使用写函数来做这个吗?任何帮助赞赏:)

1 个答案:

答案 0 :(得分:2)

我想你想要:

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

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

编辑:

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

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

对于Postgres:

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

对于SQL Server:

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

编辑II:

您希望按最早的日期订购交易。获取最早的日期,然后执行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