sql - DENSE_RANK() OVER(按 UniqueIdentifier 排序)问题

标签 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 (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

关于sql - DENSE_RANK() OVER(按 UniqueIdentifier 排序)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28191972/

相关文章:

sql - 在数据库中查询第 "trim"行

php - mysql 查询在 php 中按日期条件过滤特定行?

sql-server - 通过curl将CSV文件加载到Azure SQL仓库

c# - 在数据库中存储货币值的最佳方式是什么?

mysql - 分区 MySQL : Error Code 1679 when trying to partion a table

PHP SQL Server 无法连接

sql-server - 如何在没有 UNION 的情况下选择一个父行及其子行的其他行?

c# - 用 linq 实现密集排名

MySQL 从 DENSE_RANK() 结果更新相同的表字段

sql - T-SQL 上的 RANK、ROW_NUMBER