SQL 基于分组依据的字符串聚合
SQL string aggregation based on a group by
我有一个INT数据集,varchar。整数可以分组为 1 到 5 的小集合,我想查看所有对应文本的计数。例如。输入table(格式apols)
1,a
2,a
2,b
3,a
3,q
3,z
4,a
我可以按 Int 分组,但不知道如何跨行连接。在上面我想知道的计数:
a,2
ab,1
aqz,1
我能否完全在 SQL 中执行此操作,最好是以通用的数据库不可知的方式?
如果您使用 MySQL,您可以使用 GROUP_CONCAT
将每个整数值的字符连接成字符串,然后 COUNT
每个字符串的出现次数:
SELECT str, COUNT(*) AS count
FROM (SELECT GROUP_CONCAT(str ORDER BY str SEPARATOR '') AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在 Oracle 中你可以使用 LISTAGG
:
SELECT str, COUNT(*) AS count
FROM (SELECT LISTAGG(str, '') WITHIN GROUP (ORDER BY str) AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在 SQL Server 2017 及更高版本中,您可以使用 STRING_AGG
:
SELECT str, COUNT(*) AS count
FROM (SELECT STRING_AGG(str, '') WITHIN GROUP (ORDER BY str) AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在 Postgre 中SQL 你也可以使用 STRING_AGG
:
SELECT str, COUNT(*) AS count
FROM (SELECT STRING_AGG(str, '' ORDER BY str) AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在所有情况下,输出都是:
STR COUNT
a 2
ab 1
aqz 1
您可以在 SQL 服务器中使用 string_agg()
。在此处查看演示 sqlfiddle
select
cnct_str,
count(*) as count
from
(
select
string_agg(chars, '') within group (order by chars) as cnct_str
from tabs
group by id
) val
group by cnct_str
Sybase 支持 LIST()
函数。所以:
select chrs, count(*) as cnt
from (select t.number, list(t.chr, '' order by t.chr) as chrs
from t
group by t.number
) n
group by chrs
order by count(*) desc;
我有一个INT数据集,varchar。整数可以分组为 1 到 5 的小集合,我想查看所有对应文本的计数。例如。输入table(格式apols)
1,a
2,a
2,b
3,a
3,q
3,z
4,a
我可以按 Int 分组,但不知道如何跨行连接。在上面我想知道的计数:
a,2
ab,1
aqz,1
我能否完全在 SQL 中执行此操作,最好是以通用的数据库不可知的方式?
如果您使用 MySQL,您可以使用 GROUP_CONCAT
将每个整数值的字符连接成字符串,然后 COUNT
每个字符串的出现次数:
SELECT str, COUNT(*) AS count
FROM (SELECT GROUP_CONCAT(str ORDER BY str SEPARATOR '') AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在 Oracle 中你可以使用 LISTAGG
:
SELECT str, COUNT(*) AS count
FROM (SELECT LISTAGG(str, '') WITHIN GROUP (ORDER BY str) AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在 SQL Server 2017 及更高版本中,您可以使用 STRING_AGG
:
SELECT str, COUNT(*) AS count
FROM (SELECT STRING_AGG(str, '') WITHIN GROUP (ORDER BY str) AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在 Postgre 中SQL 你也可以使用 STRING_AGG
:
SELECT str, COUNT(*) AS count
FROM (SELECT STRING_AGG(str, '' ORDER BY str) AS str
FROM data
GROUP BY i) d
GROUP BY str
ORDER BY str
在所有情况下,输出都是:
STR COUNT
a 2
ab 1
aqz 1
您可以在 SQL 服务器中使用 string_agg()
。在此处查看演示 sqlfiddle
select
cnct_str,
count(*) as count
from
(
select
string_agg(chars, '') within group (order by chars) as cnct_str
from tabs
group by id
) val
group by cnct_str
Sybase 支持 LIST()
函数。所以:
select chrs, count(*) as cnt
from (select t.number, list(t.chr, '' order by t.chr) as chrs
from t
group by t.number
) n
group by chrs
order by count(*) desc;