来自mysql表的最新速率和数量总和

时间:2017-10-25 04:57:59

标签: mysql

我的表格如下所示:

uid    added_on                rm_id     qnty        rate

1      2017-10-23 10:48:50     5         2           30
2      2017-10-23 10:48:50     6         4           70
3      2017-10-23 10:48:50     7         5           10
4      2017-10-24 11:02:10     5         10          28
5      2017-10-24 11:02:10     6         2           75
6      2017-10-24 11:03:37     7         1           15
7      2017-10-25 11:02:10     6         5           65
8      2017-10-25 11:03:37     7         8           12

我需要rm_id,其quantity(即rm_id 5为12(2 + 10)),最后添加rate(最新费率可以从最新添加的_找到)速率或每个rm_id的最后一个uid)。结果应该如下所示:

结果

rm_id  total_qnty   rate

5      12           28
6      11           65
7      14           12

我尝试使用

实现这一目标
SELECT `rm_id`, sum(`qnty`),`rate` FROM `stock` group by `rm_id` having max(`uid`)

  SELECT `rm_id`, sum(`qnty`),`rate` FROM `stock` group by `rm_id` having max(date(`added_on`))

但是没有得到所需的结果..请帮助我..

3 个答案:

答案 0 :(得分:1)

having max(uid)转换为having 8 rm_id = 7。 MySQL处理数字> 0为真,所以这变为having true,即不以任何方式限制我的结果。无论如何,汇总结果都不包含单一费率,因此尝试通过HAVING获取结果为时已晚。您需要一个聚合函数,例如Oracle的KEEP LAST,但MySQL没有这个功能。

您想要的是获得最大值uid并在其帮助下选择相关记录:

select
  stock.rm_id,
  stockagg.sum_qnty,
  stock.rate as last_rate
from 
(
  select 
    rm_id, 
    sum(qnty) as sum_qnty, 
    max(uid) as max_uid
  from stock 
  group by rm_id
) stockagg
join stock on stock.uid = stockagg.max_uid;

答案 1 :(得分:1)

您需要找到最大日期,并从中确定费率,并将该费率应用于总计数量。

select
    t.rm_id, t.rate, gd.sum_qty, gd.sum_qty * t.rate
from table1 t
inner join (
    select rm_id, max(added_on) max_date, sum(qnty) sum_qty
    from table1
    group by rm_id
    ) gd on t.rm_id = gd.rm_id and t.added_on = gd.max_date

数据模型很奇怪,为什么不分开费率?

答案 2 :(得分:0)

您可以使用子查询:

SELECT `rm_id`, sum(`qnty`),
  (SELECT `rate`
   FROM `stock` s1
   WHERE `uid` = (SELECT `uid`
                  FROM `stock` s2
                  WHERE s2.`rm_id` = s1.`rm_id`
                  ORDER BY `added_on` DESC
                  LIMIT 1)
  ) AS `rate`
FROM `stock`
GROUP BY `rm_id`