使用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
);
任何建议......
答案 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)