sql - 查询以计算特定列值的出现次数

标签 sql postgresql

假设我有一个包含以下值的表

1
1
1
2
2
2
3
3
3
1
1
1
2
2
2

我需要得到一个这样的输出,它计算 a 的每次出现 特定值

 1  1
 1  2
 1  3
 2  1
 2  2
 2  3
 3  1
 3  2 
 3  3
 1  1
 1  2
 1  3
 2  1
 2  2
 2  3

注意:这是一个示例表 实际表是一个复杂的表,有很多行和列,查询包含更多条件

最佳答案

如果数字在不同的“岛屿”上重复,那么您需要先计算一个值来维护这些岛屿 (grpnum)。第一步可以通过从分区行号中减去原始的从上到下的行号 (raw_rownum) 来进行。该结果为每个“岛”提供了对该岛唯一的引用,然后可用于对后续行号进行分区。由于每个订单可能会干扰结果,我发现有必要使用单独的步骤并传递先前的计算,以便可以重复使用。

SQL Fiddle

MS SQL Server 2014 架构设置:

CREATE TABLE Table1  ([num] int);

INSERT INTO Table1  ([num])
VALUES  (1),(1),(1),(2),(2),(2),(3),(3),(3),(1),(1),(1),(2),(2),(2);

查询 1:

select
    num
    , row_number() over(partition by (grpnum + num) order by raw_rownum) rn
    , grpnum + num island_num
from (
    select
           num
         , raw_rownum - row_number() over(partition by num order by raw_rownum) grpnum
         , raw_rownum
    from (
          select
              num
             , row_number() over(order by (select null)) as raw_rownum
          from table1
         ) r
     ) d
;

Results :

| num | rn | island_num |
|-----|----|------------|
|   1 |  1 |          1 |
|   1 |  2 |          1 |
|   1 |  3 |          1 |
|   2 |  1 |          5 |
|   2 |  2 |          5 |
|   2 |  3 |          5 |
|   1 |  1 |          7 |
|   1 |  2 |          7 |
|   1 |  3 |          7 |
|   3 |  1 |          9 |
|   3 |  2 |          9 |
|   3 |  3 |          9 |
|   2 |  1 |         11 |
|   2 |  2 |         11 |
|   2 |  3 |         11 |

关于sql - 查询以计算特定列值的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47217584/

相关文章:

sql - 建议 : dilemma in designing typical user-group-relation DB tables

java - Hibernate + Spring with Oracle - 使用分层查询(START WITH + CONNECT BY)

django - 如何安全地转发 Django 中的主键序列?

xml - Postgresql:如何更改 XML 列中属性的值?

ruby-on-rails - 排序规则不能与 postgresql 一起正常工作

页面顶部的 PHP 回显

sql - 删除重复项后面的行

sql - 在 PostGIS 中查找包含一个点的所有多边形

postgresql - 如何将 PostgreSQL 转义字节转换为十六进制字节?

sql - Postgres PL/pgSQL 函数结果到文件,文件名作为参数