具有两个表的SQL查询聚合函数
我试图从SQL中查询一些数据,以便它对一些列求和,从另一个表中获取其他列的最大值和相应的值。比如说, |表1|具有两个表的SQL查询聚合函数,sql,sql-server,database,Sql,Sql Server,Database,我试图从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
|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)
股份已汇总,日期为max(日期),价格为相应max(日期)的价格
到目前为止,我已经:
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)
这不是最大(日期)对应的价格
这两个数据集之间的唯一链接是它们的id号,这就是为什么
inner join
table2 t2 on t2.id = t1.id
完成了。第二个表中根本没有日期。有什么帮助吗
谢谢。所以,在我写一个查询之前,您基本上想要在最长日期内的价格,对吗?你有最高价格、股份总数、最高限价、再次股份总数等等
我的猜测是,您需要基于最晚日期(Max)的最新价格,然后计算最晚日期,该最晚日期的最新股份,并将其相加?你也在对ID、共享和其他没有意义的东西进行分组,似乎你想对共享、侧边和交换进行分组,但不想对ID进行分组。看起来你在其他东西上设置了最大值,这样它们就出现了,而不必对它们进行分组,只要我想我知道你在找什么,这对你不起作用=)让我知道,如果我知道你的最终结果“规格”是什么,我肯定能帮你。所以,在我写一个查询之前,你基本上想要在最长日期内的价格,对吗?你有最高价格、股份总数、最高限价、再次股份总数等等
我的猜测是,您需要基于最晚日期(Max)的最新价格,然后计算最晚日期,该最晚日期的最新股份,并将其相加?你也在对ID、共享和其他没有意义的东西进行分组,似乎你想对共享、侧边和交换进行分组,但不想对ID进行分组。看起来你在其他东西上设置了最大值,这样它们就出现了,而不必对它们进行分组,如果我知道你的最终结果“规格”是什么,请告诉我,我绝对可以帮你。我会使用按日期排序的最大分区进行子查询,以显示最后的日期价格,然后在上层进行聚合,下面是一个如何工作的示例 样本数据
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
查询
with t1 as (
select 100 pk,1 id, 100 shares, getdate()-3 date union all
select 100 pk,2 id, 200 shares, getdate()-5 date union all
select 101 pk,3 id, 500 shares, getdate()-2 date union all
select 101 pk,4 id, 150 shares, getdate()-4 date union all
select 102 pk,5 id, 300 shares, getdate()-1 date ),
t2 as (
select 1 id, 50 price union all
select 2 id, 20 price union all
select 3 id, 70 price union all
select 4 id, 80 price union all
select 5 id, 40 price
)
SELECT pk,sum(shares) shares,max(date) date, max(price) from(
SELECT pk,
shares,
date,
MAX(price) over(partition by pk order by date desc) price
FROM t1
JOIN t2 ON t1.id = t2.id) a
group by pk
结果
pk shares date Price
--- ------- ------------------------ -----
100 300 2016-07-08 10:51:16.023 50
101 650 2016-07-09 10:51:16.023 80
102 300 2016-07-10 10:51:16.023 40
我将使用按日期排序的max over分区进行子查询,以显示最后一个日期的价格,然后在上层进行聚合,下面是一个如何工作的示例 样本数据
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
查询
with t1 as (
select 100 pk,1 id, 100 shares, getdate()-3 date union all
select 100 pk,2 id, 200 shares, getdate()-5 date union all
select 101 pk,3 id, 500 shares, getdate()-2 date union all
select 101 pk,4 id, 150 shares, getdate()-4 date union all
select 102 pk,5 id, 300 shares, getdate()-1 date ),
t2 as (
select 1 id, 50 price union all
select 2 id, 20 price union all
select 3 id, 70 price union all
select 4 id, 80 price union all
select 5 id, 40 price
)
SELECT pk,sum(shares) shares,max(date) date, max(price) from(
SELECT pk,
shares,
date,
MAX(price) over(partition by pk order by date desc) price
FROM t1
JOIN t2 ON t1.id = t2.id) a
group by pk
结果
pk shares date Price
--- ------- ------------------------ -----
100 300 2016-07-08 10:51:16.023 50
101 650 2016-07-09 10:51:16.023 80
102 300 2016-07-10 10:51:16.023 40
您可以使用子查询解决此问题。您不需要在价格列上使用任何聚合函数,只需找到最长日期,然后获取该特定日期的价格。请尝试类似的操作
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;
您可以使用子查询解决此问题。您不需要在价格列上使用任何聚合函数,只需找到最长日期,然后获取该特定日期的价格。请尝试类似的操作
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;
试试这个(别忘了用自己的表名替换@table1和@table2):
试试这个(别忘了用自己的表名替换@table1和@table2):
外部应用顶部1。。。按日期说明订购外部应用前1。。。按日期订购说明
您好,是的,我确实想要基于最新日期(最大)的最新定价。你完全正确。问题是我确实希望按ID排序,因为有些行具有需要分组的相同ID。看起来我在最初的查询中犯了一个小错误,我认为在我编辑之后,它现在更有意义了。数据集基本上是一组子订单,需要组合成多个父订单,因此需要对份额进行求和,以及其他我设置最大值的内容,以便不必分组。如果有任何帮助,我们将不胜感激。嗨,是的,我确实希望最新的价格基于最新的日期(最大)。你完全正确。问题是我确实希望按ID排序,因为有些行具有需要分组的相同ID。看起来我在最初的查询中犯了一个小错误,我认为在我编辑之后,它现在更有意义了。数据集基本上是一组子订单,需要组合成多个父订单,因此需要对份额进行求和,以及其他我设置最大值的内容,以便不必分组。任何帮助都将不胜感激