首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有等密度sql的区间

具有等密度sql的区间
EN

Stack Overflow用户
提问于 2014-02-28 06:00:27
回答 2查看 111关注 0票数 0

A有一张有贸易商统计数字的表格:

代码语言:javascript
运行
复制
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间隔构建表,按交易数计算,每个区间应该有相同数量的交易员:

代码语言:javascript
运行
复制
 number of trades   |   number of traders    |   average profit
 0-156              |   1500                 |   1.05
 156-1500           |   1500                 |   0.95
 1500-1610          |   1500                 |   1.55
 ....

查询会是什么样子?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-28 08:02:06

请看下面的查询。希望这能解决问题。

代码语言:javascript
运行
复制
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。

算法如下:

  1. 按number_of_trades的增加顺序对交易者进行编号。
  2. 将结果集划分为100块,并在每个卡盘上进行数字处理。

编辑

COUNT(*) OVER(PARTITION BY NULL)统计交易员总数。当我们把这个除以100,我们得到的是每一组的交易员数量。通常,PARTITION BY指定数据集需要分区的列,COUNT(*)计算每个分区中的记录数。PARTITION BY NULL可以将数据集中的所有记录作为一个分区来处理,因此COUNT(*)基本上就是计算数据集中的所有记录。如果没有OVER()子句,我们就不能使用COUNT(*),因为COUNT(*)是一个聚合函数,其用法将是无效的。

票数 1
EN

Stack Overflow用户

发布于 2014-02-28 07:38:44

  1. 把问题分解成较小的部分。见Polya如何解决它
  2. 一组一组(每100厘米一次)。 (只是不要在输出中显示间隔号) 选择Interval,Min(NumOfTrades)为minTrades,Max(NumOfTrades)为maxTrades,Count(*)为NumOfTraders,Avg(利润)为AvgProfit。还有一些魔法,见下文..。逐个间隔
  3. 创建间隔 (选择SeqByTradesAndID / 100作为间隔,id,NumOfTrades,从.再一次,一些内部工作.)
  4. 按升序交易顺序编号和ID (从交易商中选择计数(*)作为T2,其中( T2.NumOfTrades < T1.NumOfTrades )或( T2.NumOfTrades = T1.NumOfTrades和T2.id < T1.id)为SeqByTradesAndID,T1.id,T1.NumOfTrades,T1。

我觉得这应该行,但我还没试过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22087429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档