这句oracle的分组排序查询如何改写成postgreSQL

时间:2021-11-05 02:17:23
原oracle语句

select * 
from (
      select tr.*,rank() over(partition by tr.sensorid order by tr.collecttime desc) new_bank
      from t_racktemphum tr) trr
where trr.new_bank < 2

先按sensorid分组 再按collecttime排序,然后取每组的第一条记录

10 个解决方案

#1


SELECT *
FROM t_racktemphum AS tr
WHERE 1>(SELECT COUNT(*) FROM t_racktemphum
         WHERE tr.sensortid=sensortid
            AND collectime<tr.collectime);

#2




select t.*
from t_racktemphum t inner jon (select sensorid,max(collecttime) as m_collecttime from t_racktemphum group by sensorid) t2
on t.sensorid=t2.sensorid and t.collecttime=t2.m_collecttime


#3


select * from t_racktemphum a where not exists (select 1 from t_racktemphum b where b.sensorid=a.sensorid and b.collecttime>a.collecttime)

#4




MySQL的官方手册中的教程中有这种例子。

http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#example-maximum-row
3.6.2. 拥有某个列的最大值的行
3.6.4. 拥有某个字段的组间最大值的行

#5


两个都不对呀

第一个 column tr.sensortid does not exist

第二个查询出来还是用重复的 sensorid

#6




能否提供一些测试用记录。

#7


select * from t_racktemphum a where not exists (select 1 from t_racktemphum b where b.sensorid=a.sensorid and b.collecttime>a.collecttime)

#8


先按sensorid分组 再按collecttime排序,然后取每组的第一条记录
应该是collecttime最大的一条记录:
select a.* from tt a inner join
(select sensorid,max(collecttime) as ma from tt group by sensorid) b
on a.sensorid=b.sensorid and a.collecttime=b.ma

#9




能否提供一些测试用记录。

#10


or
假设只有两个字段sensorid,collecttime
select a.sensorid,a.collecttime from tt a
inner join tt b 
on a.sensorid=b.sensorid and a.collecttime<=b.collecttime
group by a.sensorid,a.collecttime
having count(b.sensorid)=1

#1


SELECT *
FROM t_racktemphum AS tr
WHERE 1>(SELECT COUNT(*) FROM t_racktemphum
         WHERE tr.sensortid=sensortid
            AND collectime<tr.collectime);

#2




select t.*
from t_racktemphum t inner jon (select sensorid,max(collecttime) as m_collecttime from t_racktemphum group by sensorid) t2
on t.sensorid=t2.sensorid and t.collecttime=t2.m_collecttime


#3


select * from t_racktemphum a where not exists (select 1 from t_racktemphum b where b.sensorid=a.sensorid and b.collecttime>a.collecttime)

#4




MySQL的官方手册中的教程中有这种例子。

http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#example-maximum-row
3.6.2. 拥有某个列的最大值的行
3.6.4. 拥有某个字段的组间最大值的行

#5


两个都不对呀

第一个 column tr.sensortid does not exist

第二个查询出来还是用重复的 sensorid

#6




能否提供一些测试用记录。

#7


select * from t_racktemphum a where not exists (select 1 from t_racktemphum b where b.sensorid=a.sensorid and b.collecttime>a.collecttime)

#8


先按sensorid分组 再按collecttime排序,然后取每组的第一条记录
应该是collecttime最大的一条记录:
select a.* from tt a inner join
(select sensorid,max(collecttime) as ma from tt group by sensorid) b
on a.sensorid=b.sensorid and a.collecttime=b.ma

#9




能否提供一些测试用记录。

#10


or
假设只有两个字段sensorid,collecttime
select a.sensorid,a.collecttime from tt a
inner join tt b 
on a.sensorid=b.sensorid and a.collecttime<=b.collecttime
group by a.sensorid,a.collecttime
having count(b.sensorid)=1