0

我有一个像这样的“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
4

2 回答 2

0

我正在调整(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

  • 为表的 single-user_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;
于 2017-04-17T16:18:48.927 回答
0

如果您想从 SQlite 数据库中选择最后 5 条记录,请使用 SELECT * FROM table_name ORDER BY user_id DESC LIMIT 5; 查询

于 2020-07-03T07:28:32.493 回答