【问题标题】:Sorting by a to z with Limit使用限制按 a 到 z 排序
【发布时间】:2014-02-09 15:16:26
【问题描述】:

我有一张表 customers,其中有一个字段“name”,其中包含 a 到 z 名称记录。

我使用 asc 查询从 a 到 z 获取记录

SELECT * FROM `customers` ORDER BY name ASC

但是我怎样才能得到 5 条以所有 a 到 z 字母开头且只有一个查询的记录呢?

输出:

  1. 一个

  2. 一个

  3. 一个

  4. 一个

  5. 一个

  6. b

  7. b

  8. b

  9. b

  10. b 依此类推到 z。 提前致谢。

【问题讨论】:

标签: mysql sql select sql-order-by top-n


【解决方案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吗?
  • @TonyStark 抱歉,我是 sqllite 的新手。
  • 我收到此错误 [无法识别的令牌:“:”],如果你能帮助我的话。
  • @TonyStark 抱歉,SQLLite 无法为您提供帮助
  • 好的np。感谢您的回答,但我稍后会接受。我在 sqlite 中也需要它(但我可以给你投票)。你能解释一下你的查询吗?太棒了。
【解决方案2】:

使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多