简体   繁体   中英

Oracle- Selecting max value in a column with reference to a where clause

I have a table t1

site| count1 | count2
aaa | 1100   | 500 
aaa | 1000   | 400
bbb | 1500   | 700
bbb | 1200   | 600

I want to get the row with the highest column value(1100) corresponding to the site aaa

I am looking for a something like

select max(count1),count2 from t1 where site=aaa

You may use the LAST aggregate function

SELECT site
    ,MAX(count1)
    ,MAX(count2) KEEP (DENSE_RANK LAST ORDER BY count1) as count2
FROM t1
WHERE site = 'aaa'
GROUP BY site

OR row_number()

SELECT site
    ,count1
    ,count2
FROM (
    SELECT t1.*
        ,row_number() OVER (
            ORDER BY count1 DESC
            ) as rn
    FROM t1 WHERE site = 'aaa'
    )
WHERE rn = 1;

OR FETCH FIRST n ROWS ONLY ( Oracle 12c +)

SELECT site
    ,count1
    ,count2 FROM t1
    WHERE site = 'aaa'
   ORDER BY count1 DESC FETCH FIRST 1 ROWS ONLY;

For considering ties, you may alternatively use dense_rank() or rank() instead of row_number() or WITH TIES option in 12c

When you want to use multiple site ( not just 'aaa' ), you should add PARTITION BY SITE inside OVER()

OR MAX Analytic function

SELECT site
    ,count1
    ,count2
FROM (
    SELECT t1.*
        ,MAX(count1) OVER (PARTITION BY SITE) AS max_count1
    FROM t1
    WHERE site = 'aaa'
    )
WHERE count1 = max_count1

SQL Fiddle Demo

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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