如何从以下数据中提取行

时间:2017-12-12 19:42:09

标签: sql oracle greatest-n-per-group

使用Oracle SQL。

COL1        COL2                COL3    COL4
2017-12-01  2017-12-01 02:00    296.82  161
2017-12-01  2017-12-01 06:00    287.25  158
2017-12-01  2017-12-01 10:00    290.3   157
2017-12-01  2017-12-01 14:00    345.58  157
2017-12-01  2017-12-01 18:00    285.13  156
2017-12-01  2017-12-01 22:00    287.68  158
2017-12-02  2017-12-02 02:00    306.5   164
2017-12-02  2017-12-02 06:00    315.79  166
2017-12-02  2017-12-02 10:00    307.59  164

我需要做的是从每天获得MAX(COL3),但我也需要排除其他值......我可以按照COL1进行分组,但我有问题要回到另一个也可以从行中计算COL2和COL4。

几乎没有这个不起作用这是说来自一个不好的位置.....

SELECT *,MAX(VDC) OVER (PARTITION BY DATETHE) from (select 
trunc(x.lvl) "DATETHE",
energy_metrics_pdu.WATTS_READING "PDU",
case energy_metrics_pdu.watts_reading
when 0 then NULL
else round(energy_metrics_vdc.watts_reading/energy_metrics_pdu.WATTS_READING,2)
END "RATIO",
energy_metrics_vdc.watts_reading "VDC"
from (  SELECT to_date('01-DEC-2017','DD-MON-YYYY') + (level/24)-0  lvl
        FROM dual
        CONNECT BY LEVEL <= (5*24)-1 ) x 
        LEFT JOIN energy_metrics_pdu on to_char(x.lvl, 'YYYY-MM-DD HH24') = to_char(energy_metrics_pdu.READING_DATE, 'YYYY-MM-DD HH24') 
        LEFT join energy_metrics_vdc on to_char(x.lvl, 'YYYY-MM-DD HH24')||':00' = to_char(energy_metrics_vdc.READING_DATE, 'YYYY-MM-DD HH24:MI')
        where energy_metrics_pdu.watts_reading IS NOT NULL  order by "DATETHE" ASC
         ); 

任何建议......

3 个答案:

答案 0 :(得分:1)

您希望每COL3行的COL1行数最多。典型的方法是使用类似RANK的窗口函数进行排名,然后保持排名最佳的行:

select col1, col2, col3, col4
from
(
  select col1, col2, col3, col4, rank() over (partition by col1 order by col3 desc) as rn
  from mytable
)
where rn = 1
order by col1;

答案 1 :(得分:0)

你可以做一些复杂的连接,或者你可以像这样使用OVER clause

SELECT *, MAX(COL3) OVER (PARTITION BY COL1) FROM [table]

答案 2 :(得分:0)

正如@Thorsten Kettner所说,col1不需要存储,考虑到这一点,你可以使用以下内容:

with t as
(
 select trunc(col2) col2, max(col3) max_col3 
   from mytable
  group by trunc(col2) 
 )
 (
   select m.* from t inner join mytable m on t.col2 = trunc(m.col2) and t.max_col3 = m.col3  
   )

demo1

demo2