Dense_rank 查询在 sql(4 个不同的列)中

DS

我有一个表如下:

Sn no.  t_time              Value  rate  
ABC     17-MAY-18 08:00:00  100.00  3
ABC     17-MAY-18 22:00:00  200.00  1
ABC     16-MAY-18 08:00:00  100.00  1
XYZ     14-MAY-18 01:00:00  700.00  1
XYZ     15-MAY-18 10:00:00  500.00  2
XYZ     15-MAY-18 13:00:00  100.00  2

我想生成如下输出:

Sn no.     New_value
ABC        150
XYZ        450

它是由分组Sn no.New_value是每个日期值乘以速度的最晚时间,然后取平均值在一起。例如ABCnew_value是Average of:[(100*1) and (200*1)]

它是一个大型数据集。如何以最有效的方式为上述内容编写查询。请帮忙。

您可以使用解析函数( row_number()) 来实现结果

SQL> WITH cte_table(Snno, t_time, Value, rate) AS (
  2    SELECT 'ABC', to_date('2018-05-17 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), 100.00, 3 FROM DUAL UNION ALL
  3    SELECT 'ABC', to_date('2018-05-17 22:00:00', 'YYYY-MM-DD HH24:MI:SS'), 200.00, 1 FROM DUAL UNION ALL
  4    SELECT 'ABC', to_date('2018-05-16 08:00:00', 'YYYY-MM-DD HH24:MI:SS'), 100.00, 1 FROM DUAL UNION ALL
  5    SELECT 'XYZ', to_date('2018-05-14 01:00:00', 'YYYY-MM-DD HH24:MI:SS'), 700.00, 1 FROM DUAL UNION ALL
  6    SELECT 'XYZ', to_date('2018-05-15 10:00:00', 'YYYY-MM-DD HH24:MI:SS'), 500.00, 2 FROM DUAL UNION ALL
  7    SELECT 'XYZ', to_date('2018-05-15 13:00:00', 'YYYY-MM-DD HH24:MI:SS'), 100.00, 2 FROM DUAL),
  8    --------------------------------
  9    -- End of data preparation
 10    --------------------------------
 11  rn_table AS (
 12    SELECT t.*, row_number() OVER (PARTITION BY TRUNC(t_time) ORDER BY t_time DESC) AS rn
 13      FROM cte_table t)
 14  SELECT snno,
 15         AVG(VALUE * rate) new_value
 16    FROM rn_table
 17   WHERE rn = 1
 18   GROUP BY snno;

输出:

SNNO  NEW_VALUE
---- ----------
ABC         150
XYZ         450

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章