按字母顺序排序并限制数量。

6
我有一张名为customers的表,其中有一个字段 'name',记录了A到Z的姓名。我使用升序查询按照字母顺序获取记录。
SELECT * FROM `customers` ORDER BY name ASC

但是如何使用一个查询获取以所有a到z字母开头的5条记录?

输出结果:

  1. a

  2. a

  3. a

  4. a

  5. a

  6. b

  7. b

  8. b

  9. b

  10. b 以此类推到z。 提前感谢。


这个任务需要作为一个单独的 SQL 语句/查询完成,还是可以调用存储过程/函数来提供结果? - Raad
@Raad 作为一个单一的查询。 - Tony Stark
相关:https://dev59.com/KVnUa4cB1Zd3GeqPXiGT - thicolares
2个回答

1
尝试这个:

SELECT c.name
FROM (SELECT c.name, IF(@lastLetter=@lastLetter:=LEFT(c.name, 1), @cnt:=@cnt+1, @cnt:=0) letterCnt
      FROM customers c, (SELECT @lastLetter:='', @cnt:=0) A 
      ORDER BY c.name ASC
    ) AS c
WHERE c.letterCnt < 5

Saharsh Shah,我在MySQL中得到了结果,但在SQLite中没有。你能帮我解决SQLite的问题吗? - Tony Stark
@TonyStark 抱歉,我是SQLite的新手。 - Saharsh Shah
我遇到了这个错误[无法识别的标记:":"], 你能帮我吗? - Tony Stark
@TonyStark 抱歉,我无法帮助你解决SQLLite问题。 - Saharsh Shah
好的,没问题。谢谢你的回答,但我稍后会接受它。我也需要在sqlite中实现它(但我可以给你点赞)。你能稍微解释一下你的查询吗?它很棒。 - Tony Stark

-1

当你使用SQL时,你可以使用像RankDENSE_RANK和ROW_NUMBER这样的函数

DECLARE @Customer AS TABLE
(
    Id int,
    Name varchar(50)
)

INSERT INTO @Customer VALUES
(1, 'aa'),
(2, 'ab'),
(3, 'ac'),
(4, 'ba'),
(5, 'bb'),
(6, 'bc'),
(7, 'ca'),
(8, 'cb'),
(9, 'cc')

select *
from (
    select *, 
        RANK() OVER(PARTITION BY SUBSTRING(Name, 1, 1) ORDER BY Name ASC) AS [Rank] 
    from @Customer
) tableWithRank
WHERE tableWithRank.Rank <= 2

输出:

1|  aa|1

2|  ab|2

4|  ba|1

5|  bb|2

7|  ca|1

8|  cb|2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接