postgres 实现查询某条数据的排名

我就废话不多说了,大家还是直接看代码吧~

select * from (select ROW_NUMBER () OVER (ORDER BY fat desc nulls last) AS xuhao,foodnum,foodname,fat from ek_food where isdel=0) food where foodnum = 'Ss192008'

涉及到的问题

1.排序时,字段值为null的会排在前面,导致数据不准确,解决办法 在order by后面增加 nulls last

2.给查询的结果增加序号 select ROW_NUMBER () OVER (ORDER BY fat desc nulls last) AS xuhao

补充:利用 PostgreSQL 实现对数据进行排名

一、需求:对以下用户的积分进行排名计算

user_id name score
1 john 1000
2 mike 1200
3 jelly 1300
4 brook 1500
5 nanny 1200

需要知道 user_id = k 的用户对应的积分排名

二、通过 PostgreSQL 的窗口函数实现

SELECT user_id, name, score, RANK() OVER (ORDER BY score DESC) FROM user;

user_id name score rank
4 brook 1500 1
3 jelly 1200 2
2 mike 1300 3
5 nanny 1500 3
1 john 1200 5

如要获取排名 < 3 的用户:

SELECT user_id, name, score, user_rank FROM (SELECT user_id, name, score, RANK() OVER (ORDER BY score DESC) AS user_rank FROM user) AS T WHERE user_rank < 3;

-- 注意子查询在from中需要写别名

user_id name score rank
4 brook 1500 1
3 jelly 1200 2

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • postgresql查询锁表以及解除锁表操作

    1.-- 查询ACTIVITY的状态等信息 select T.PID, T.STATE, T.QUERY, T.WAIT_EVENT_TYPE, T.WAIT_EVENT, T.QUERY_START from PG_STAT_ACTIVITY T where T.DATNAME = '数据库用户名'; 上面查询结果中:pid就是ACTIVITY的唯一标识,state就是活动状态,query就是正在执行的sql语句,query--start就是开始执行的时间. 2.-- 查询死锁的ACTIVIT

  • postgresql数据库根据年月查询出本月的所有数据操作

    表里的所有数据: 现在我要根据创建时间的 年月查询 当月所有的数据 比如前台传给我一个年月的字段planTimeMonth,值为2018-06 那么我们需要查询创建时间为6月份的所有数据 sql: java代码中sql拼接: criteria.andCondition("to_char(crt_time, 'yyyy-mm')='"+query.get("planTimeMonth").toString()+"'"); 补充:postgresql

  • postgresql通过索引优化查询速度操作

    当数据量比较大的时候,提升查询效率就是需要去考虑的事情了.一个百万级别的表格,如果不做任何优化的话,即使是最简单的查询语句执行起来也是慢的让人难以接受:当然"优化"本身是一个比较复杂的工程,从设计表.字段到查询语句的写法都有很多讲究,这里只考虑索引的方式,且是最普通的索引: 下面的操作中对应数据库表w008_execrise_info(8000数据量), w008_wf02_info(4000数据量) 1 任务表数据 SELECT w.* FROM w008_wf02_info w W

  • Postgresql 实现查询一个表/所有表的所有列名

    假设postgres有数据库testdb 在testdb下执行下列sql语句,得到所有表的信息 select * from information_schema.columns where table_schema='public' and table_name<>'pg_stat_statements'; 在testdb下执行下列sql语句,得到所有表的列名 select column_name from information_schema.columns where table_sche

  • postgres 实现查询某条数据的排名

    我就废话不多说了,大家还是直接看代码吧~ select * from (select ROW_NUMBER () OVER (ORDER BY fat desc nulls last) AS xuhao,foodnum,foodname,fat from ek_food where isdel=0) food where foodnum = 'Ss192008' 涉及到的问题 1.排序时,字段值为null的会排在前面,导致数据不准确,解决办法 在order by后面增加 nulls last 2

  • 解决mybatis一对多关联查询多条数据只显示一条的问题

    一对多,如果多个表字段名相同,要记住使用别名,否则多条数据只显示一条 <resultMap type="com.example.demo.model.TuserModel" id="extendMapper"> <id column="id" property="id" /> <result column="user_name" property="userName&

  • mysql 查询重复的数据的SQL优化方案

    在mysql中查询不区分大小写重复的数据,往往会用到子查询,并在子查询中使用upper函数来将条件转化为大写.如: 复制代码 代码如下: select * from staticcatalogue WHERE UPPER(Source) IN (SELECT UPPER(Source) FROM staticcatalogue GROUP BY UPPER(Source) having count(UPPER(Source))>1) ORDER BY upper(Source) DESC; 这条

  • MySQL 多表关联一对多查询实现取最新一条数据的方法示例

    本文实例讲述了MySQL 多表关联一对多查询实现取最新一条数据的方法.分享给大家供大家参考,具体如下: MySQL 多表关联一对多查询取最新的一条数据 遇到的问题 多表关联一对多查询取最新的一条数据,数据出现重复 由于历史原因,表结构设计不合理:产品告诉我说需要导出客户信息数据,需要导出客户的 所属行业,纳税性质 数据:但是这两个字段却在订单表里面,每次客户下单都会要求客户填写:由此可知,客户数据和订单数据是一对多的关系:那这样的话,问题就来了,我到底以订单中的哪一条数据为准呢?经过协商后一致同

  • 关于MyBatis 查询数据时属性中多对一的问题(多条数据对应一条数据)

    数据准备 数据表 CREATE TABLE `teacher`( id INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=INNODB DEFAULT CHARSET=utf8; INSERT INTO `teacher`(id,`name`) VALUES(1,'大师'); CREATE TABLE `student`( id INT(10) NOT NULL, `name` VARCHAR

  • Mysql中一千万条数据怎么快速查询

    目录 普通分页查询 如何优化 偏移量大 采用id限定方式 优化数据量大问题 普通分页查询 当我们在日常工作中遇到大数据查询的时候,第一反应就是使用分页查询. mysql支持limit语句来选取指定的条数数据,而oracle可以使用rownum来选取 mysql分页查询语句如下: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 第一个参数用来指定第一个返回记录行的偏移量 第二个参数指定返回记录行的最大数目 当相同的偏移量时

  • oracle实现根据字段分组排序,取其第一条数据

    目录 以某个字段分组 取其第一条数据 oracle中对表中数据分组排序取最值 首先创建操作表emp 业务场景 总结 以某个字段分组 取其第一条数据 select *   from (select t.app_id,                t.emp_no,                t.device_id,                t.device_type,                t.last_connect_time,                t.device

  • Oracle结合Mybatis实现取表TOP 10条数据

    之前一直使用mysql和informix数据库,查表中前10条数据十分简单: 最原始版本: select top * from student 当然,我们还可以写的复杂一点,比如外加一些查询条件? 比如查询前10条成绩大于80分的学生信息 添加了where查询条件的版本: select top * from table where score > 80 但是!!oracle中没有top啊!!!!那么该如何实现呢? 嗯,可以用rownum! oracle中原始版本 select * from st

  • MySQL优化总结-查询总条数

    1.COUNT(*)和COUNT(COL) COUNT(*)通常是对主键进行索引扫描,而COUNT(COL)就不一定了,另外前者是统计表中的所有符合的纪录总数,而后者是计算表中所有符合的COL的纪录数.还有有区别的. 优化总结,对于MyISAM表来说: 1.任何情况下SELECT COUNT(*) FROM tablename是最优选择: 2.尽量减少SELECT COUNT(*) FROMtablename WHERE COL = 'value' 这种查询: 3.杜绝SELECT COUNT(

  • 四种数据库随机获取10条数据的方法

    四种数据库随机获取10条数据的方法 SQL Server: 复制代码 代码如下: SELECT TOP 10 * FROM T_USER ORDER BY NEWID() ORACLE: 复制代码 代码如下: SELECT * FROM (SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE RONUM <= 10 MySQL: 复制代码 代码如下: SELECT * FROM T_USER  ORDER BY  RAND() LIM

随机推荐