选择N个随机记录

时间:2016-04-27 22:32:49

标签: python sql sqlite

我有 7200行29个用户,他们参加了10个不同类别的唯一请求票据。

其中,我需要为每个用户选择 N 记录。

条件:

  1. 在N中,40%的行应该属于 X 类别,让我们说编辑。

  2. 剩余的60%行应该是使用 X

  3. 类别以外的行

    使用sqlite,我通过尝试'DISTINCT'到目前为止处理但有没有办法实现上述目标?

    select distinct * from report 
    where category <> 'Editorial'
    and 
    name in (select distinct name from report)
    GROUP By name
    LIMIT (select count(distinct name) from report)
    

    编辑:我正在使用python进行上述所有操作。由于它是一个大数据,我更喜欢sqlite。 如果在python中有一种方法,我很乐意了解它。

2 个答案:

答案 0 :(得分:1)

考虑使用两个分组的运行计数子查询:1)所有记录按名称和仅编辑类别; 2)所有记录按名称和非编辑类别和过滤60%和40%。以下假设表具有唯一标识符ID。并将N子句中的WHERE替换为实际数字:

SELECT *    
FROM 
(
  SELECT Report.*

      (SELECT Count(*) FROM Report sub1
       WHERE sub1.Category = 'Editorial' AND Report.Category = 'Editorial'
       AND sub1.Name = Report.Name
       AND sub1.ID <= Report.ID) As EditorialRowNo

      (SELECT Count(*) FROM Report sub2
       WHERE sub2.Category <> 'Editorial' AND Report.Category <> 'Editorial'
       AND sub2.Name = Report.Name
       AND sub2.ID <= Report.ID) As NonEditorialRowNo

  FROM Report
) As dT

WHERE (dT.EditorialRowNo > 0 AND dT.EditorialRowNo <= 0.4 * N)
OR (dT.NonEditorialRowNo > 0 AND dT.NonEditorialRowNo <= 0.6 * N)
ORDER BY dT.Name, dT.Category

答案 1 :(得分:0)

好的,对你的规格还是有点困惑。此代码将运行,但我可能无法完全理解您正在寻找的内容:

import sqlite3

conn = sqlite3.connect('users.db')

cur = conn.cursor()

count = cur.execute('SELECT COUNT(id) FROM book')

count = count.fetchone()[0]

total1 = int(count * 0.4)
total2 = int(count * 0.6)

results1 = cur.execute('SELECT users.id from users LIMIT ?',
                       (total1, )).fetchall()
results2 = cur.execute('SELECT users.id from users LIMIT ?',
                       (total2, )).fetchall()