如何在 Oracle SQL 开发人员中查找字符串的最大出现次数

how to find the maximum occurence of a string in Oracle SQL developer

我在 table 中有 2 列。数据看起来像这样

Folio_no | Flag
1145       R

201        S

1145       FR

300        E

1145       R

201        E

201        S

Expected Output:

Folio_No | Flag

1145        R

201         S

300         E

输出应给出 folio_no 以及针对该特定作品集编号出现最大次数的标志。

我尝试执行以下操作,但它会引发错误

select folio_no,来自 table 的 max(count(flag)) 按 folio_no;

分组

我们可以使用聚合:

WITH cte AS (
    SELECT Folio_No, Flag, COUNT(*) AS cnt
    FROM yourTable
    GROUP BY Folio_No, Flag
),
cte2 AS (
    SELECT t.*, RANK() OVER (PARTITION BY Folio_No ORDER BY cnt DESC, Flag) rnk
    FROM cte t
)

SELECT Folio_No, Flag
FROM cte2
WHERE rnk = 1;

请注意,我假设如果给定作品集编号中的两个标志与最大频率相关联,那么您想要报告较早的标志。

这是一个有效的 demo

如果您想要每个作品集中出现次数最多的标志,则可以使用:

SELECT Folio_No, Flag
FROM   (
  SELECT Folio_No,
         Flag,
         RANK() OVER (PARTITION BY Folio_No ORDER BY COUNT(*) DESC) AS rnk
  FROM   table_name
  GROUP BY Folio_No, Flag
)
WHERE  rnk = 1;

其中,对于示例数据:

CREATE TABLE table_name (folio_no, flag) AS
  SELECT 1145, 'R'  FROM DUAL UNION ALL
  SELECT 201,  'S'  FROM DUAL UNION ALL
  SELECT 1145, 'FR' FROM DUAL UNION ALL
  SELECT 300,  'E'  FROM DUAL UNION ALL
  SELECT 1145, 'R'  FROM DUAL UNION ALL
  SELECT 201,  'E'  FROM DUAL UNION ALL
  SELECT 201,  'S'  FROM DUAL UNION ALL
  SELECT 201,  'S'  FROM DUAL UNION ALL
  SELECT   1,  'A'  FROM DUAL UNION ALL
  SELECT   1,  'A'  FROM DUAL UNION ALL
  SELECT   1,  'B'  FROM DUAL UNION ALL
  SELECT   1,  'B'  FROM DUAL UNION ALL
  SELECT   1,  'C'  FROM DUAL UNION ALL
  SELECT   1,  'D'  FROM DUAL;

输出:

FOLIO_NO FLAG
1 A
1 B
201 S
300 E
1145 R

如果您只想要每个作品集中出现次数最多的单个标志,并且如果有平局则每个作品集中的第一个作品集按字母顺序排列,则:

SELECT Folio_No, Flag
FROM   (
  SELECT Folio_No,
         Flag,
         ROW_NUMBER() OVER (PARTITION BY Folio_No ORDER BY COUNT(*) DESC, flag) AS rn
  FROM   table_name
  GROUP BY Folio_No, Flag
)
WHERE  rn = 1;

其中,对于示例数据输出:

FOLIO_NO FLAG
1 A
201 S
300 E
1145 R

db<>fiddle here