mybatis里面我要动态查询表的前n行数据:SELECT * FROM aa FETCH FIRST #NUM ROWS ONLY的#NUM 怎么写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis里面我要动态查询表的前n行数据:SELECT * FROM aa FETCH FIRST #NUM ROWS ONLY的#NUM 怎么写相关的知识,希望对你有一定的参考价值。

<select id="getAllClueVerifyCgtPage" parameterType="map" resultType="map" >
SELECT *
FROM aa
<if test="NUM != null">
FETCH FIRST #NUM ROWS ONLY
</if>

</select>

参考技术A SELECT *
FROM aa
<if test="NUM != null">
FETCH FIRST $NUM ROWS ONLY

这样就可以了,我在项目也这样处理的本回答被提问者采纳

选择分组查询的前 n 行

【中文标题】选择分组查询的前 n 行【英文标题】:Select first `n` rows of a grouped query 【发布时间】:2021-01-06 23:35:47 【问题描述】:

我正在使用带有 SQLAlchemy 的 PostgreSQL

我有一个 GPS 指标表格,格式如下:

SELECT * FROM user_gps_location;

我的输出:

|编号 |用户 ID |进入时间 |纬度 |液化天然气 |准确性 |海拔|速度 | | 1 | 54 | 2020-07-24 14:08:30.000000 | 54.42184220 | -110.21029370 | 41.42 | 512.40 | 0.07 | | 2 | 54 | 2020-07-24 22:20:12.000000 | 54.42189750 | -110.21038070 | 13.00 | 512.60 | 0.00 | | 3 | 26 | 2020-07-27 13:51:11.000000 | 54.41453910 | -110.20775990 | 1300.00 | 0.00 | 0.00 | | 4 | 26 | 2020-07-27 22:59:00.000000 | 54.42122590 | -110.20959960 | 257.52 | 509.10 | 0.00 | | 5 | 26 | 2020-07-28 13:54:12.000000 | 54.42185280 | -110.21025010 | 81.45 | 510.20 | 0.00 | ...

我需要能够回答问题“自“”以来每个用户的最新 5 个条目是什么,按 entry_time 排序

现在我只有一个基本的查询:

select *
from user_gps_location
where user_id in (select distinct user_id
                  from user_gps_location
                  where entry_time > '2020-09-01')
  and entry_time > '2020-09-01';

应用限制不会达到我想要的效果。我假设我需要使用分组和窗口函数(?),但我不明白它们。

【问题讨论】:

附带说明:您正在使用字符串文字作为日期。更好地使用日期文字,即在字符串前面加上关键字日期:entry_time &gt; date '2020-09-01'. 基本的窗口函数并不难理解。您希望每个用户都有一个结果,因此您按 user_id 分组,只是在窗口函数中这不是称为GROUP BY,而是称为PARTITION BY。然后,排名函数(RANKDENSE_RANKROW_NUMBER)也需要一个ORDER BY 子句。在您的情况下,您需要按 entry_time 降序排序。 【参考方案1】:

你可以使用FETCH FIRST N ROWS ONLY

select * from user_gps_location
where entry_time > '2020-09-01'
order by entry_time desc
fetch first 5 rows only

【讨论】:

【参考方案2】:

row_number 函数正是您想要的:

SELECT * 
FROM   (SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY entry_time DESC) AS rn
        FROM   user_gps_location
        WHERE  entry_time > '2020-09-01') t
WHERE  rn <= 5

【讨论】:

以上是关于mybatis里面我要动态查询表的前n行数据:SELECT * FROM aa FETCH FIRST #NUM ROWS ONLY的#NUM 怎么写的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis ResultMap多表映射DTO

Mybatis动态SQL语句使用

如何跳过sql查询中的前n行

Django模型查询总和为给定数字的前N行

Mysql查询动态行转动态列,并使用mybatis执行导出

mybatis 动态SQL查询总结