我正在尝试从SQL查询某些数据,使其汇总一些列,获取其他列的最大值以及另一个表中的相应值。例如,
|表1 |
|order id| |id| |shares| |date| other stuff
12345 1 100 05/13/16 XXX
12345 2 200 05/15/16 XXX
12345 3 300 06/12/16 XXX
12345 4 400 02/22/16 XXX
56789 5 1000 03/30/16 XXX
56789 6 200 02/25/16 XXX
22222 7 5000 01/10/16 XXX
|表2 |
|id| |price|
1 21.2
2 20.2
3 19.1
4 21.3
5 100.0
6 110.0
7 5.0
我希望我的输出为:
|shares| |date| |price| other stuff
1000 06/12/16 19.1 max(other stuff)
1200 03/30/16 1000.0 max(other stuff)
5000 01/10/16 5.0 max(other stuff)
已对股票进行总结,日期为最大值(日期),价格为相应最大值(日期)的价格。
到目前为止,我有:
select
orderid, stock, side, exchange,
max(startdate), max(enddate),
sum(shares), sum(execution_price * shares) / sum(shares),
max(limitprice), max(price)
from
table1 t1
inner join
table2 t2 on t2.id = t1.id
where
location = 'CHICAGO'
and startdate > '1/1/2016'
and order_type = 'limit'
group by
orderid, stock, side, exchange
然而,这会返回:
|shares| |date| |price| |other stuff|
1000 06/12/16 21.3 max(other stuff)
1200 03/30/16 1100.0 max(other stuff)
5000 01/10/16 5.0 max(other stuff)
这不是max(date)的相应价格。
两个数据集之间唯一的链接是它们的id号,这就是
的原因inner join
table2 t2 on t2.id = t1.id
完成了。第二张表中根本没有日期。有什么帮助吗?
感谢。
答案 0 :(得分:2)
您可以使用子查询解决此问题。您不需要在价格列上使用任何聚合函数,只需查找最大日期然后获取该特定日期的价格。尝试这样的事情..
select t5.*, t4.price
from
(select t1.order_id, sum(t1.shares) as shares, max(t1.date) as maxdate, max(other_stuff) as other_stuff
from Table1 t1
inner join
Table2 t2 on t2.id = t1.id
group by t1.order_id) t5
inner join Table1 t3
on t5.maxdate = t3.date and t5.order_id = t3.order_id
inner join Table2 t4
on t3.id = t4.id;
答案 1 :(得分:1)
所以,在我给你写一个查询之前,你基本上想要在最大日期期间的价格,对吗?您有MAX的价格,股票总和,最高限价,再次股票等等。
我的猜测是你想要根据最新日期(Max)的最新价格,然后运行最新日期的计算,最新日期的最新股数,以及所有这些的总和?您还要对ID,共享以及其他没有意义的事情进行分组,看起来您可能希望对Shares,Side和Exchange进行分组,而不是ID。看起来你把最大限度放在其他东西上只是为了让它们出现而不必对它们进行分组,只要我认为我知道你在寻找什么,这对你想要的东西不起作用=)让我知道如果我知道你的最终结果“规格”是什么,我绝对可以提供帮助。
答案 2 :(得分:1)
我会使用按日期排序的最大分区来进行子查询,以显示最后的日期价格,然后在上一级进行聚合,这是一个如何工作的示例。
示例数据
input
<强>查询强>
let input: AnyObject!
do {
input = try AVCaptureDeviceInput.init(device: captureDevice)
}
catch let error as NSError {
// error handling ...
}
// ... use input
<强>结果强>
pk id shares date id price
------- --- -------- -------------------------- --- -------
100 1 100 2016-07-08 10:40:34.707 1 50
100 2 200 2016-07-06 10:40:34.707 2 20
101 3 500 2016-07-09 10:40:34.707 3 70
101 4 150 2016-07-07 10:40:34.707 4 80
102 5 300 2016-07-10 10:40:34.707 5 40
答案 3 :(得分:1)
试试这个(不要忘记用自己的表名替换@ table1和@ table2):
SELECT Aggregated.shares
, Aggregated.date
, Aggregated.other_stuff
, T2.price
FROM (
SELECT order_id
, SUM(shares) as shares
, MAX(date) as date
, MAX(other_stuff) as other_stuff
FROM @table1 AS T1
GROUP BY order_id
) AS Aggregated
INNER JOIN @table1 AS T1 ON Aggregated.order_id = T1.order_id AND Aggregated.date = T1.date
INNER JOIN @table2 AS T2 ON T2.id = T1.id