Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在所有值中查找'Name'的第一个字符的计数,然后对其进行排序(PostgreSQL)_Sql_Postgresql - Fatal编程技术网

在所有值中查找'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马的名字是。它是非保留关键字,不需要引号。答案已更新。如文件所述