sql - 根据所选列中的相同值向行添加数字

标签 sql postgresql aggregate-functions window-functions

我有一个 PostgreSQL 数据库,其中包含由几个司法管辖区编写的交通罚单。

一些司法管辖区不指明是否在一个交通站点写了多张罚单。但是,可以通过分析其他领域来推断这一点。考虑以下数据:

ticket_id  timestamp            drivers_license
----------------------------------------------
1          2008-08-07 01:51:00  11111111
2          2008-08-07 01:51:00  11111111
3          2008-08-07 02:02:00  22222222
4          2008-08-07 02:25:00  33333333
5          2008-08-07 04:23:00  44444444
6          2008-08-07 04:23:00  55555555
7          2008-08-07 04:23:00  44444444

我可以推断:

  • 罚单 1 和 2 是在一个交通站点写的,因为它们共享驾照号码和时间戳。
  • 5 号票和 7 号票也一样,但请注意 6 号票在它们之间的位置。可能另一位警官同时在其他地方写了一张罚单,或者数据输入运算符(operator)输入了乱序的东西。

我想添加另一列,该列对每个交通站点都有一个唯一 ID。它不会是表的主键,因为它会有重复的值。例如:

ticket_id  timestamp            drivers_license  stop_id
--------------------------------------------------------
1          2008-08-07 01:51:00  11111111         1
2          2008-08-07 01:51:00  11111111         1
3          2008-08-07 02:02:00  22222222         2
4          2008-08-07 02:25:00  33333333         3
5          2008-08-07 04:23:00  44444444         4
6          2008-08-07 04:23:00  55555555         5
7          2008-08-07 04:23:00  44444444         4

我可以想到使用 C# 执行此操作的计算密集型贪婪算法方法,但是否有有效的 SQL 查询可以工作?

最佳答案

如果您雇用 window function rank()这变得非常简单:

SELECT *
      ,rank() OVER (ORDER BY ts, drivers_license)
FROM   tbl
ORDER  BY ticket_id

准确返回您要求的内容。

我将您的列 timestamp 重命名为 ts,因为 timestamp 是 PostgreSQL 中的类型名称并且是 reserved word在每个 SQL 标准中。

关于sql - 根据所选列中的相同值向行添加数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9612678/

相关文章:

mysql - mysql 中的复杂旋转

java - 如何关闭postgres打开的​​所有端口?

ios - 将字节数组转换为 UIImage

sql - iPad (iOS 3.2) 不支持 HTML5 readTransaction?

mysql - 对多列进行 COUNT

MySQL 聚合列作为不同值的集合

sql - mysql 组连接

scala - Scala 聚合函数的示例

mysql - SQL 将值更新为另一个表中的值

python - Windows 7 Heroku Python Django LNK2001 psycopg2 错误