【问题标题】:How to select last 5 results from each user_id in an sqlite database?如何从 sqlite 数据库中的每个 user_id 中选择最后 5 个结果?
【发布时间】:2017-09-11 22:58:39
【问题描述】:

我有一个像这样的“num”表的数据库

user_id  |  number   |  unix_time
-----------------------------
123         2           xxxxxxxx
123         40          xxxxxxxx
123         24          xxxxxxxx
333         23          xxxxxxxx
333         67          xxxxxxxx
854         90          xxxxxxxx

我想选择每个 user_id 插入的最后 5 个数字,但我不知道该怎么做。

我试过了:

SELECT b.n, a.user_id
FROM num a
JOIN num b on a.user_id = b.user_id
WHERE (
    SELECT COUNT(*)
    FROM num b2
    WHERE b2.n <= b.n
        AND b2.user_id = b.user_id
) <= 5

【问题讨论】:

  • 欢迎来到 StackOverflow。请参观 stackoverflow.com/tour,学习提出好问题 stackoverflow.com/help/how-to-ask,制作 MCVE stackoverflow.com/help/mcve 对于 SQLite,MCVE 包括您的 SQLite 数据库的 .dump .
  • “最后一个”是什么意思?最近根据列“unix_time”?然后你应该提供适当时间的样本数据。

标签: sqlite limit-per-group


【解决方案1】:

我正在改编来自 (sql query - how to apply limit within group by) 的答案。
我使用“2”而不是“5”来使效果在您的示例数据中可见。
请注意,我使用实际日期而不是您的“xxxxxxxx”,假设您在写“last 5”时很可能是指“最近的 5”,并且仅适用于实际时间。

select * from toy a
    where a.ROWID IN  
    ( SELECT b.ROWID FROM toy b
      WHERE b.user_id = a.user_id
      ORDER by unix_time DESC 
      LIMIT 2 
    ) ;

它是怎么做的:

  • 即时制作表格(即() 中的部分)
  • 每个 user_id 一个,WHERE b.user_id = a.user_id
  • 单独订购每个动态表(这是第一个技巧),
    通过在() 中进行排序
  • 按时间倒序排列ORDER by unix_time DESC
  • 限制为 5 个(在示例 2 中)条目LIMIT 2
  • 分别限制每个动态表(这是第二个技巧),
    通过在() 中进行限制
  • 从实际表中选择所有内容,select * from toy,
    但只从实际表中选择出现在所有动态表中的那些行,
    where a.ROWID IN (

  • 为表的总视图引入区分别名“a”,
    toy a

  • 为表的单用户ID视图引入区分别名“b”,
    toy b

顺便说一下,这是我用于测试的转储
(这是充分利用 MCVE 的一种便捷方式):

BEGIN TRANSACTION;
CREATE TABLE toy (user_id int, number int, unix_time date);
INSERT INTO toy VALUES(123,2,'1970-01-01 05:33:20');
INSERT INTO toy VALUES(123,40,'1970-01-01 06:56:40');
INSERT INTO toy VALUES(123,24,'1970-01-01 08:20:00');
INSERT INTO toy VALUES(333,23,'1970-01-01 11:06:40');
INSERT INTO toy VALUES(333,67,'1970-01-01 12:30:00');
INSERT INTO toy VALUES(854,90,'1970-01-01 13:53:20');
COMMIT;

【讨论】:

    【解决方案2】:

    如果您想从 SQlite 数据库中选择最后 5 条记录,请使用查询 SELECT * FROM table_name ORDER BY user_id DESC LIMIT 5; 使用此查询,您可以选择最近 n 笔交易...希望对您有所帮助

    【讨论】:

      猜你喜欢
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      相关资源
      最近更新 更多