sql如何获取第k高的值(去重)

学习limit

LIMIT 子句用于限制查询返回的行数。
语法:LIMIT [offset,] row_count 或 LIMIT row_count OFFSET offset。

示意代码

SELECT i_id, i_amount
FROM insurance
WHERE i_amount = (
    SELECT DISTINCT i_amount
    FROM insurance
    ORDER BY i_amount DESC
    LIMIT 3, 1
)
LIMIT 1;

疑问:为什么要使用子查询?
写成这样可以吗

select i_id,distinct i_amount
from insurance
order by i_amount desc
limit 3,1;

子查询的必要性在于:

获取唯一且排序的值:通过 SELECT DISTINCT i_amount 确保 i_amount 是唯一的,并通过 ORDER BY i_amount DESC 按降序排序。
定位特定位置的值:使用 LIMIT 3, 1 跳过前3个值,并选择第4个值。
过滤外部查询:外部查询根据子查询结果过滤 insurance 表,获取与第4高 i_amount 对应的记录。
这种方法分步处理,以确保正确找到第4高的唯一 i_amount 并过滤出对应的记录。直接在 SELECT 子句中使用 DISTINCT 和 ORDER BY 是不可能实现这个目标的,因为 SQL 不支持在 SELECT 列表中使用 DISTINCT 关键字和排序控制。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
在Hive SQL中,如果你只想去除时间重复而保留其他列的数据,你可以使用ROW_NUMBER() OVER函数来实现。这个函数可以根据指定的列进行分组,并为每个分组的行分配一个唯一的行号。你可以在查询中使用ROW_NUMBER() OVER函数,并将它与其他列一起选择,以确保仅去除时间重复而保留其他列的数据。举个例子,假设你有一个名为person_appear_record的表,包含id、face_id和appear_time三列,你可以使用以下代码实现时间不去重而其他列去重的查询: SELECT id, face_id, appear_time FROM ( SELECT id, face_id, appear_time, ROW_NUMBER() OVER (PARTITION BY appear_time ORDER BY id) AS row_num FROM person_appear_record ) t WHERE row_num = 1; 这个查询将基于appear_time列进行分组,并为每个不同的appear_time分配一个唯一的行号。然后,我们选择行号为1的行,这样就只会保留每个appear_time中的第一行,而其他重复的行会被去除。这样,你就可以实现时间不去重而其他列去重的查询。123 #### 引用[.reference_title] - *1* *3* [SQL:数据去重的三种方法](https://blog.csdn.net/qq_35091353/article/details/127805844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [【数据分析】sql实现数据固定时间间隔去重!!!](https://blog.csdn.net/weixin_37598243/article/details/127797392)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wniuniu_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值