标签: limit-per-group

如何选择每组的前N行?

我有两个这样的SQLite表:

 AuthorId | AuthorName
----------------------
 1        | Alice
 2        | Bob
 3        | Carol
 ...      | ....


 BookId | AuthorId | Title
----------------------------------
 1      | 1        | aaa1
 2      | 1        | aaa2
 3      | 1        | aaa3
 4      | 2        | ddd1
 5      | 2        | ddd2
 ...    | ...      | ...
 19     | 3        | fff1
 20     | 3        | fff2
 21     | 3        | fff3
 22     | 3        | fff4
Run Code Online (Sandbox Code Playgroud)

我想创建一个SELECT查询,它将返回每个AuthorId的前N行(例如两行),按Title排序("选择每个作者的前两本书").

样本输出:

 BookId |  AuthorId | AuthorName …
Run Code Online (Sandbox Code Playgroud)

sql sqlite greatest-n-per-group limit-per-group

23
推荐指数
2
解决办法
2万
查看次数

每组最新N条记录的平均值

我当前的应用程序根据每个用户的所有记录计算点平均值:

SELECT `user_id`, AVG(`points`) AS pts 
FROM `players` 
WHERE `points` != 0 
GROUP BY `user_id`
Run Code Online (Sandbox Code Playgroud)

业务需求已更改,我需要根据每个用户的最近30条记录计算平均值.

相关表格具有以下结构:

桌子:球员; 列:player_id,user_id,match_id,points

表:用户; columns:user_id

以下查询不起作用,但它确实演示了我尝试实现的逻辑.

SELECT @user_id := u.`id`, (
    -- Calculate the average for last 30 records
    SELECT AVG(plr.`points`) 
    FROM (
        -- Select the last 30 records for evaluation
        SELECT p.`points` 
        FROM `players` AS p 
        WHERE p.`user_id`=@user_id 
        ORDER BY `match_id` DESC 
        LIMIT 30
    ) AS plr
) AS avg_points 
FROM `users` AS u
Run Code Online (Sandbox Code Playgroud)

是否有一种相当有效的方法来根据每个用户的最新30条记录计算平均值?

mysql average greatest-n-per-group limit-per-group

10
推荐指数
2
解决办法
8960
查看次数

SQLite:在每个组中仅返回前2个结果

我检查了类似问题的其他解决方案,但是sqlite不支持 row_number()rank()函数,或者没有涉及连接多个表的示例,将它们按多列分组并且同时仅为每个组返回前N个结果.

这是我运行的代码

db = sqlite3.connect('mydb')

cursor = db.cursor()

cursor.execute(
    '''
    CREATE TABLE orders(
        id INTEGER PRIMARY KEY, product_id INTEGER,
        client_id INTEGER
        )
    '''
)

cursor.execute(
    '''
    CREATE TABLE clients(
        id INTEGER PRIMARY KEY, gender TEXT,
        city TEXT
        )
    '''
)

cursor.execute(
    '''
    CREATE TABLE products(
        id INTEGER PRIMARY KEY, category_name TEXT
        )
    '''
)

orders = [
    (9, 6), (3, 10), (8, 6), (4, 8),
    (5, 6), (7, 4), (9, 2), (10, 8),
    (4, 6), …
Run Code Online (Sandbox Code Playgroud)

python sqlite greatest-n-per-group limit-per-group

5
推荐指数
1
解决办法
818
查看次数

限制分组中的每个组

现在我知道这个问题之前已经被问过好几次了,但是我已经尝试将不同的现有解决方案应用于我的具体问题很长一段时间了,但没有成功。所以我转向这里希望得到一些指导。

我有一个名为 tblanswers 的表,其中包含链接到另一个表中不同问题的答案。我想要的是获取特定问题 ID 的每个答案的计数,但将其限制为每月的第 n 个答案。

来自 tblanswers 的示例数据:

id  qid answer  timestamp
72  162 2       1366027324
71  161 4       1343599200
70  162 2       1366014201
69  161 4       1366011700
68  162 2       1366006729
67  161 3       1366010948
66  162 2       1365951084
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的查询:

SELECT *, COUNT(*) c FROM(
    SELECT answer, timestamp, YEAR(FROM_UNIXTIME(timestamp)) yr, MONTH(FROM_UNIXTIME(timestamp)) mo FROM tblanswers
        WHERE qid = 161
            ORDER BY timestamp ASC
) q GROUP BY YEAR(FROM_UNIXTIME(timestamp)), MONTH(FROM_UNIXTIME(timestamp)), answer
Run Code Online (Sandbox Code Playgroud)

这会给我这样的结果:(样本数据中的日期和数字不准确)

answer  yr      mo  c
1 …
Run Code Online (Sandbox Code Playgroud)

mysql group-by greatest-n-per-group limit-per-group

5
推荐指数
1
解决办法
1179
查看次数