【发布时间】:2015-03-27 08:04:25
【问题描述】:
我正在努力让 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),那将是一团糟,也不符合我的要求。
有什么想法吗?我什至使用 write 功能来做到这一点?任何帮助表示赞赏:)
【问题讨论】:
-
你想要
ROW_NUMBER而不是DENSE_RANK吗? -
不,无论发票如何,Row_Number 都会为发票编号执行 1、2、3、4、5、6、7,我需要每个 TxnId 1 个唯一发票编号,但按日期排序。
-
不,你可以使用
ROW_NUMBER() OVER (Partition By TxnId Order by TxnDate) -
我就是这么做的。然后根据有多少相同 TxnId 的实例进行计数。也就是说,如果有 3 个实例具有相同的事务 ID,则每个实例都有一个唯一的编号,这是不正确的。它需要 TxnId 唯一,因此 1 TxnId = 1 Invoice Number。
标签: sql sql-server dense-rank sql-order-by