如何在 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
我在 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