要获取 ID I 和时间戳 T 的组中的记录数,请使用以下查询:
SELECT COUNT(*)
FROM MyTable
WHERE item_id = I
AND timestamp = T
要得到限制,乘以X,然后使用ROUND/CAST 转换为整数:
SELECT CAST(ROUND(COUNT(*) * X / 100) AS INTEGER)
FROM MyTable
WHERE item_id = I
AND timestamp = T
要获取特定组中在该限制范围内的所有记录,请按价格对组中的记录进行排序,并限制返回的计数:
SELECT *
FROM MyTable
WHERE item_id = I
AND timestamp = T
ORDER BY price
LIMIT (SELECT CAST(ROUND(COUNT(*) * X / 100) AS INTEGER)
FROM MyTable
WHERE item_id = I
AND timestamp = T)
理论上,要获得组平均值,请在其周围添加GROUP BY:
SELECT item_id,
timestamp,
(SELECT AVG(price)
FROM (SELECT price
FROM MyTable T2
WHERE T2.item_id = T1.item_id
AND T2.timestamp = T1.timestamp
ORDER BY price
LIMIT (SELECT CAST(ROUND(COUNT(*) * X / 100) AS INTEGER)
FROM MyTable T3
WHERE T3.item_id = T1.item_id
AND T3.timestamp = T1.timestamp)
)
) AS AvgPriceLowestX
FROM MyTable T1
GROUP BY item_id,
timestamp
但是,SQLite 似乎不允许从LIMIT 子句内部访问相关变量,因此这在实践中不起作用。
您必须获取所有组的 ID (SELECT DISTINCT item_id, timestamp FROM MyTable) 并为每个组执行上面的第三个查询。
无论如何,请确保在item_id、timestamp 和price 三列上都有一个索引以获得良好的性能。