从表的每个列的不同值中选择n行

时间:2019-08-13 22:30:33

标签: sqlite

我有一个庞大的数据库,我想根据一列进行抽样。 该列有10个不同的值,对于每个值,我想从数据库中选择5行。

我尝试了这种查询,但是一旦数据变大,它就会非常慢。

SELECT *
FROM table AS A
WHERE rowid IN (SELECT rowid FROM table WHERE value=A.value LIMIT 5)

Input:

SOURCE  DATE            VALUE

IG  2018-12-31  ONE
IG  2019-05-24  TWO
IG  2018-12-31  THREE
TW  2019-06-24  SIX
FB  2019-06-24  FIVE
FB  2019-06-24  FIVE
FB  2019-06-24  ONE
FB  2019-06-24  THREE
FB  2019-06-18  FIVE
FB  2019-06-18  SIX
FB  2019-06-18  ONE
FB  2019-06-18  ONE
IG  2019-06-24  TWO
FB  2019-05-24  THREE
IG  2019-06-24  THREE
RD  2019-06-24  TWO
RD  2019-06-24  SIX
RD  2019-06-24  ONE
TW  2019-06-24  FIVE
FB  2019-06-24  TWO

=============

Output:

SOURCE  DATE            VALUE

FB  2019-06-24  ONE
FB  2019-06-18  ONE
IG  2019-05-24  TWO
RD  2019-06-24  TWO
FB  2019-05-24  THREE
IG  2019-06-24  THREE
FB  2019-06-24  FIVE
FB  2019-06-24  FIVE
FB  2019-06-18  SIX
RD  2019-06-24  SIX

1 个答案:

答案 0 :(得分:0)

窗口函数(需要sqlite 3.25或更高版本)允许一种简单的方法:

SELECT source, date, value
FROM (SELECT source, date, value
           , row_number() OVER (PARTITION BY value) AS rn
      FROM yourtable)
WHERE rn <= 5
ORDER BY value;

为每个不同的value插入任意五行。在value上建立索引将非常有帮助-如果您还没有索引,也会加快您的版本。