按某个字段分组然后从每组取出某个字段最大的一条纪录

记录一下有下面函数可以使用。

SELECT
 *        
FROM
 (
		SELECT *, 
			ROW_NUMBER () OVER (PARTITION BY package_name ORDER BY version_code DESC) rn 
		FROM va_file            
	) T        
WHERE rn = 1

 

以及一下子就能想到的:

SELECT
    vf.*
FROM
    va_file vf
JOIN (
    SELECT
        package_name,
        MAX (version_code) AS version_code
    FROM
        va_file
    WHERE
        status = 2
    GROUP BY
        package_name
) tmp ON vf.package_name = tmp.package_name
AND vf.version_code = tmp.version_code

 

类似的需求有:

1、查找用户每天第一次登录的时间

-- 查找用户每天第一次登录的时间
select * FROM
(
	select user_id, create_datetime,  
		ROW_NUMBER () OVER (PARTITION BY to_char(create_datetime,'yyyy-MM-dd') ORDER BY create_datetime ASC) rn  
	from user_login_log ORDER BY user_id
) t
where rn = 1

 

2、继而拓展出类似的需求:根据用户登录记录表查询用户连续登录天数

select 
	user_id,
	min(create_datetime) start_date,
	max(create_datetime) end_date,
	count(1) running_days

from (
	select 
		user_id,
		create_datetime,
		date_part('day',create_datetime::timestamp - timestamp'2017-01-01') day_interval,
		row_number() over(partition by user_id order by to_char(create_datetime,'yyyy-MM-dd')) day_rank,
		(
			row_number() over(partition by user_id order by to_char(create_datetime,'yyyy-MM-dd'))
		) - (
			date_part('day',create_datetime::timestamp - timestamp'2017-01-01')
		) diff_value
	from (
			select * FROM (
					select user_id, 
								create_datetime,  
								ROW_NUMBER () OVER (PARTITION BY to_char(create_datetime,'yyyy-MM-dd') ORDER BY create_datetime) rn  
					from user_login_log
			) t
			where rn = 1
	) t
) t 
GROUP BY user_id, diff_value
order by user_id, start_date
;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值