低版本:row_number() over partition by 分组聚合函数不能用
如果版本高可以直接用:
select * ,row_number() over (partition by c_id order by s_score) from score;
现在来说说SQL该怎么写:
第一种:
SELECT
t1.*
FROM
(
SELECT
wh.id,
wh.ywid,
wh.ywlx,
wh.jmxm,
wh.jmsfzh,
wh.xxzt,
wh.cjsj,
hd.whjg,
hd.whzt,
hd.lydz,
hd.lysc,
hd.bdzt,
hd.bdhtnr,
hd.shzt
FROM
xx_jl_aiwh wh
LEFT JOIN xx_jl_aihd hd ON hd.id = wh.id
WHERE
wh.jmsfzh IN ( '330624194908035333' )
AND wh.ywlx = 3
) t1
WHERE
( SELECT count( 1 ) FROM xx_jl_aiwh t2 WHERE t1.jmsfzh = t2.jmsfzh AND t2.cjsj >= t1.cjsj )<= 1;
原理:取出第一个查询出来的所有数据 t1 与 第二个查询 t2 进行联合查询,主要是 <= 1 这个关键点,这个sql语句会把 t1 中的每一条数据都拿来执行 t2 这个查询,判断对应的数量是不是 <=1【肯定只有最大的时间点才会 = 1】,因此就可以得到一个 合并重复,并只取最大时间的数据集合。【具体需求看你自己】
第二种:
SELECT t1.* FROM xx_jl_aihd t1,( SELECT jmsfzh, max( cjsj ) AS maxcjsj FROM xx_jl_aihd GROUP BY jmsfzh ) t2
WHERE
t1.jmsfzh = t2.jmsfzh
AND t1.cjsj = t2.maxcjsj;
原理:这个就比较好理解了,先查出最大的时间点,然后再根据这些时间查出对应数据