A有一张有贸易商统计数字的表格:
id | number of trades | profit
1 | 10 | 1.05
2 | 20 | 1.06
3 | 1000 | 1.06
4 | 100 | 0.95
5 | 150 | 1.06
6 | 20 | 1.06
7 | 20 | 1.07
...
我想用100间隔构建表,按交易数计算,每个区间应该有相同数量的交易员:
number of trades | number of traders | average profit
0-156 | 1500 | 1.05
156-1500 | 1500 | 0.95
1500-1610 | 1500 | 1.55
....
查询会是什么样子?
发布于 2014-02-28 08:02:06
请看下面的查询。希望这能解决问题。
SELECT MIN(number_of_trades)::text || '-' || MAX(number_of_trades)::text AS "number of trades"
, COUNT(number_of_trades) AS "number of traders"
, AVG(number_of_trades*profit) AS AvgProfit
FROM
(
SELECT ROW_NUMBER() OVER(ORDER BY number_of_trades) AS rn
, number_of_trades
, profit
, (COUNT(*) OVER(PARTITION BY NULL) / 100) AS Grp
FROM TradersStat
) tab
GROUP BY (rn - 1) / Grp
在这里,您可以看到它的工作:SQL Fiddle
解决方案假定记录的计数至少为100。
算法如下:
编辑
COUNT(*) OVER(PARTITION BY NULL)
统计交易员总数。当我们把这个除以100,我们得到的是每一组的交易员数量。通常,PARTITION BY
指定数据集需要分区的列,COUNT(*)
计算每个分区中的记录数。PARTITION BY NULL
可以将数据集中的所有记录作为一个分区来处理,因此COUNT(*)
基本上就是计算数据集中的所有记录。如果没有OVER()
子句,我们就不能使用COUNT(*),因为COUNT(*)
是一个聚合函数,其用法将是无效的。
发布于 2014-02-28 07:38:44
我觉得这应该行,但我还没试过。
https://stackoverflow.com/questions/22087429
复制相似问题