繁体   English   中英

获取特定列中具有最高值的不同值

[英]Getting distinct values with the highest value in a specific column

如何从SQL中获取下表中突出显示的行? (突出显示基于具有最高版本的用户名的不同行)

在此输入图像描述

如果您需要纯文本表:

+----+-----------+---+
| 1  | John      | 1 |
+----+-----------+---+
| 2  | Brad      | 1 |
+----+-----------+---+
| 3  | Brad      | 3 |
+----+-----------+---+
| 4  | Brad      | 2 |
+----+-----------+---+
| 5  | Jenny     | 1 |
+----+-----------+---+
| 6  | Jenny     | 2 |
+----+-----------+---+
| 7  | Nick      | 4 |
+----+-----------+---+
| 8  | Nick      | 1 |
+----+-----------+---+
| 9  | Nick      | 3 |
+----+-----------+---+
| 10 | Nick      | 2 |
+----+-----------+---+
| 11 | Chris     | 1 |
+----+-----------+---+
| 12 | Nicole    | 2 |
+----+-----------+---+
| 13 | Nicole    | 1 |
+----+-----------+---+
| 14 | James     | 1 |
+----+-----------+---+
| 15 | Christine | 1 |
+----+-----------+---+

到目前为止我所拥有的是(适用于一个用户)

SELECT USER, VERSION 
FROM TABLE 
WHERE USER = 'Brad' 
AND VERSION  = (SELECT MAX(VERSION ) FROM TABLE WHERE USER= 'Brad')
SELECT USER, max(VERSION) VERSION
FROM TABLE GROUP BY USER;

如果你需要一个ID

SELECT ID, USER, VERSION FROM (
    SELECT ID, USER, VERSION, 
           RANK() OVER(PARTITION BY USER ORDER BY VERSION DESC) RNK 
    FROM TABLE
) WHERE RNK = 1;

如果你有

| 2  | Brad      | 5 |
+----+-----------+---+
| 3  | Brad      | 3 |
+----+-----------+---+
| 4  | Brad      | 5 |

使用RANK的查询为您提供了两个用户

| 2  | Brad      | 5 |
+----+-----------+---+
| 4  | Brad      | 5 |

如果只需要一行,那么用ROW_NUMBER()替换RANK() ROW_NUMBER()

在您的查询中,您正在使用AND VERSION = (SELECT MAX(VERSION ) FROM TABLE WHERE USER= 'Brad') ,它相当于RANK()(所有行的最大值为VERSION)

first_value分析函数应该可以解决问题:

SELECT DISTINCT FIRST_VALUE (id) 
                   OVER (PARTITION BY name ORDER BY version DESC)
       name,
       FIRST_VALUE (version) 
                   OVER (PARTITION BY name ORDER BY version DESC)
FROM   my_table

另一种方法是使用row_number函数:

SELECT id, name, version
FROM   (SELECT id, name, version
               ROW_NUMBER() OVER (PARTITION BY name ORDER BY version DESC) rn
        FROM   my_table)
WHERE   rn = 1

个人而言,不确定我更喜欢哪个。 他们每个人都有自己的优点和丑陋。

这可能对你有所帮助:

select id, user, version 
from 
(
   select id, user, version, row_number() over (partition by user order by version desc) rownum
   from yourtable
) as t
where t.rownum = 1    

sql小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM