根据特定字段中的最高值将MAX()结果限制为一行

时间:2017-09-20 15:15:53

标签: sql oracle

当然我的数据集更复杂,但这基本上就是我所拥有的:

+--------+--------+-------+
| SEQ_NO | FILTER | VALUE |
+--------+--------+-------+
|      1 | 'A'    |     5 |
|      2 | 'A'    |    10 |
|      3 | 'A'    |    15 |
+--------+--------+-------+

这是我的问题:

  SELECT MAX(SEQ_NO)
       , FILTER
       , VALUE
    FROM TABLE
GROUP BY FILTER
       , VALUE

这将返回我的整个数据集。如何更改我的查询以便它只返回具有最高SEQ_NO的记录?

6 个答案:

答案 0 :(得分:2)

SELECT t1.*
FROM Table AS t1
INNER JOIN
(
    SELECT MAX(SEQ_NO) MAXSeq
           , FILTER
           , VALUE
        FROM TABLE
    GROUP BY FILTER
           , VALUE
) t2  ON t1.SEQ_NO = t2.MAXSeq 
        AND t1.FILTER = t2.FILTER 
        AND t1.VALUE = t2.VALUE

或使用row_number

SELECT *
FROM
(
   SELECT *, 
     row_number() over(partition by FILTER, VALUE 
                       order by SEQ_NO desc) as rn
   FROM table
) t 
WHERE rn = 1

答案 1 :(得分:1)

来自Oracle 12C:

SELECT SEQ_NO
       , FILTER
       , VALUE
    FROM TABLE
 ORDER BY SEQ_NO DESC
FETCH FIRST 1 ROWS ONLY;

答案 2 :(得分:0)

如果我理解正确,你想要每个过滤器的顶部SEQ_NO吗?

我在SQL Server中创建了这个并转换为Oracle

SELECT  a.SEQ_NO,
        a.FILTER,
        a.VALUE
FROM    (
            SELECT  SEQ_NO,
                    FILTER,
                    VALUE,
                    MAX(SEQ_NO) OVER (PARTITION BY FILTER) m
            FROM    TABLE
        ) a
WHERE   SEQ_NO = m

答案 3 :(得分:0)

使用mysql

SELECT SEQ_NO
       , VALUE
       , FILTER
    FROM TABLE
Order by SEQ_NO DESC LIMIT 1

答案 4 :(得分:0)

您可以在oracle中使用ROWNUM

select *
from  
  ( select * 
    from yourTable
    order by SEQ_NO desc )  as t
where ROWNUM = 1;

答案 5 :(得分:0)

这应该有效

SELECT TOP 1 *
FROM TABLE
ORDER BY SEQ_NO DESC