在所有值中查找'Name'的第一个字符的计数,然后对其进行排序(PostgreSQL)
我有一个包含以下行的表:在所有值中查找'Name'的第一个字符的计数,然后对其进行排序(PostgreSQL),sql,postgresql,Sql,Postgresql,我有一个包含以下行的表: key Name 1 Mighty 2 Jon 3 Jaine 4 Arya 现在我想计算表中所有NAMEs的第一个字符的每个不区分大小写的出现次数,然后按降序对结果进行排序。如果出现平局(计数等于多个字符),则应按字母顺序对结果进行排序,因此我的输出如下所示: A 3 J 2 M 1 A存在3次,一次在Jaine中,两次在Arya中 SELECT LEFT(Name,1) AS letter, COUNT(*) As ct FROM Tbl
key Name
1 Mighty
2 Jon
3 Jaine
4 Arya
现在我想计算表中所有NAME
s的第一个字符的每个不区分大小写的出现次数,然后按降序对结果进行排序。如果出现平局(计数等于多个字符),则应按字母顺序对结果进行排序,因此我的输出如下所示:
A 3
J 2
M 1
A
存在3次,一次在Jaine
中,两次在Arya
中
SELECT LEFT(Name,1) AS letter, COUNT(*) As ct
FROM Tbl
GROUP BY LEFT(Name,1)
ORDER BY ct DESC,letter
像这样试试
SELECT LEFT(Name,1) AS letter, COUNT(*) As ct
FROM Tbl
GROUP BY LEFT(Name,1)
ORDER BY ct DESC,letter
尝试此选项:
SELECT LEFT(Name, 1) AS letter, COUNT(*) AS cnt
FROM your_table
GROUP BY LEFT(Name, 1)
ORDER BY COUNT(*) DESC, letter;
请注意,如果两个或多个字母的计数相同,则“排序依据”子句首先按计数降序排序,然后按第一个字母排序。尝试此选项:
SELECT LEFT(Name, 1) AS letter, COUNT(*) AS cnt
FROM your_table
GROUP BY LEFT(Name, 1)
ORDER BY COUNT(*) DESC, letter;
请注意,
orderby
子句首先按计数降序排序,然后按第一个字母排序,如果两个或多个字母的计数相同。此代码生成预期结果。经过测试。假设数据存储在表表1
中:
with first_letters as
(
select
upper(left(Name,1)) as letter_uppercase,
count(*) as count_ignore
from table1
group by upper(left(Name,1))
),
occurrences as (
select
t1.Name,
length(t1.Name) - length(replace(upper(t1.Name), fl.letter_uppercase,'')) as occurrence
from table1 t1
inner join first_letters fl on fl.letter_uppercase = upper(left(t1.Name,1))
)
select
result.letter_uppercase,
sum(result.occurrence) as sum_occurrence
from
(
select
fl.letter_uppercase,
o.occurrence
from first_letters fl
inner join occurrences o on upper(o.Name) like '%' || fl.letter_uppercase || '%'
) result
group by result.letter_uppercase
order by sum(result.occurrence) desc,
result.letter_uppercase;
此代码生成预期的结果。经过测试。假设数据存储在表
表1
中:
with first_letters as
(
select
upper(left(Name,1)) as letter_uppercase,
count(*) as count_ignore
from table1
group by upper(left(Name,1))
),
occurrences as (
select
t1.Name,
length(t1.Name) - length(replace(upper(t1.Name), fl.letter_uppercase,'')) as occurrence
from table1 t1
inner join first_letters fl on fl.letter_uppercase = upper(left(t1.Name,1))
)
select
result.letter_uppercase,
sum(result.occurrence) as sum_occurrence
from
(
select
fl.letter_uppercase,
o.occurrence
from first_letters fl
inner join occurrences o on upper(o.Name) like '%' || fl.letter_uppercase || '%'
) result
group by result.letter_uppercase
order by sum(result.occurrence) desc,
result.letter_uppercase;
您需要首先创建表中所有字符的列表,然后创建所有第一个字符的列表,然后将它们组合在一起:
with all_chars as (
select c
from names, unnest(string_to_array(lower(name), null)) as t(c)
), first_chars as (
select distinct lower(left(name,1)) as c
from names
)
select fc.c,
(select count(*) from all_chars ac where ac.c = fc.c) as cnt
from first_chars fc
order by cnt desc, fc.c;
联机示例:您需要首先创建表中所有字符的列表,然后创建所有第一个字符的列表,然后将它们组合在一起:
with all_chars as (
select c
from names, unnest(string_to_array(lower(name), null)) as t(c)
), first_chars as (
select distinct lower(left(name,1)) as c
from names
)
select fc.c,
(select count(*) from all_chars ac where ac.c = fc.c) as cnt
from first_chars fc
order by cnt desc, fc.c;
在线示例:这似乎是一个非常基本的
groupby
查询,带有字符串函数。你试过什么?我试过使用left(name,1),但不知道应该如何逐行迭代以了解计数。A在表中重复三次,1“A”在“Jaine”中重复,2“A”在Arya@A_horse_中重复,并带有“no_name”。这似乎是一个非常基本的GROUP BY
查询,带有字符串函数。你试过什么?我试过使用left(name,1),但不知道应该如何逐行迭代以了解计数。A在表中重复三次,1“A”在“Jaine”中重复,2“A”在Arya@A_horse_中重复,A=3,J=2,M=1。你能举例说明A的预期计数是多少吗?是的,你是正确的,A马的名字是。它是非保留关键字,不需要引号。答案已更新。如中所述,从您的输出A=3,J=2,M=1。你能举例说明A的预期计数是多少吗?是的,你是正确的,A马的名字是。它是非保留关键字,不需要引号。答案已更新。如文件所述