首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在SQLITE中获取每个对象的“前10”个数字?

如何在SQLITE中获取每个对象的“前10”个数字?
EN

Stack Overflow用户
提问于 2019-08-05 16:27:32
回答 1查看 41关注 0票数 0

我有一个SQLite表,其中有author、book、release_date和seller列。

现在,我需要找到一种方法,用最新的release_date仅获取每个作者的前10本书。

如果可能的话,我还需要卖家,这是最经常出现在最新发布的前10名的书籍每个作者。结果应该是一个简单的表,只有作者和卖家。

这个问题真的快把我逼疯了。在一个SQLite查询中至少有一个部分是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-05 17:16:39

2018年9月发布的SQLite v3.25增加了window functions

您可以使用以下命令按日期计算每个作者的图书排名:

代码语言:javascript
复制
CREATE TABLE books
(
  author varchar(10),
  title varchar(10),
  release date
);
INSERT INTO books VALUES 
('aaa','ta1','2018-01-01'),
('aaa','ta2','2018-02-01'),
('aaa','ta3','2018-03-01'),
('aaa','ta4','2018-05-01'),
('bbb','tb1','2018-05-01'),
('bbb','tb2','2018-06-01')
;

SELECT
    author,
    title,
    release, 
    row_number() OVER (partition by author ORDER BY release desc) AS row_number 
FROM books

如果行是按发布日期排序的,则函数row_number() OVER (partition by author ORDER BY release desc) AS row_number会计算每个作者的行号。

这会产生以下结果:

代码语言:javascript
复制
author  title   release     row_number
aaa     ta4     2018-05-01  1
aaa     ta3     2018-03-01  2
aaa     ta2     2018-02-01  3
aaa     ta1     2018-01-01  4
bbb     tb2     2018-06-01  1
bbb     tb1     2018-05-01  2

一旦你有了行号,你就可以用一个简单的WHERE row_number <= N过滤前N个项目,例如每个作者的最后两本书:

代码语言:javascript
复制
select * from (
SELECT
    author,
    title,
    release, 
    row_number() OVER (partition by author ORDER BY release desc) AS row_number 
FROM books )
where row_number<=2

这将返回:

代码语言:javascript
复制
author  title   release     row_number
aaa    ta4      2018-05-01  1
aaa    ta3      2018-03-01  2
bbb    tb2      2018-06-01  1
bbb    tb1      2018-05-01  2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57354777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档