具有两个表的SQL查询聚合函数

具有两个表的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

我试图从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)
股份已汇总,日期为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。看起来我在最初的查询中犯了一个小错误,我认为在我编辑之后,它现在更有意义了。数据集基本上是一组子订单,需要组合成多个父订单,因此需要对份额进行求和,以及其他我设置最大值的内容,以便不必分组。任何帮助都将不胜感激