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