【问题标题】:SQL + JPA : return rows with maximum value of single columnSQL + JPA:返回单列最大值的行
【发布时间】:2017-02-07 18:01:40
【问题描述】:

我的数据库表数据如下所示:

col1                col2            col3                col4        col5        col6
value               null            null                blaDiff     0           x1  
value               null            null                blaDiff     0           x2  
value               null            blabla              null        1           x1  
value               null            blabla              null        1           x3  
value               bla             null                null        2           x1  
value               bla             null                null        2           x2  
value               otherBla        null                null        2           x3

我希望获取最大值为 col5 的行,但只获取满足过滤条件的行。我可以使用如下查询使其工作:

SELECT col1
    ,col5
    ,col6
FROM TABLE v
WHERE v.col1 = 'value'
    AND (
        v.col2 = 'bla'
        OR v.col3 = 'blabla'
        OR v.col4 = 'blaDiff'
        )
    AND v.col5 = (
        SELECT MAX(v.col5)
        FROM TABLE v1
        WHERE v1.col1 = 'value'
            AND (
                v.col2 = 'bla'
                OR v.col3 = 'blabla'
                OR v.col4 = 'blaDiff'
                )
        );

那么我的结果是这样的:

col1                col2            col3                col4        col5        col6
value               bla             null                null        2           x1  
value               bla             null                null        2           x2

我想知道是否有更好更简单的方法来做到这一点。请注意,我在我的主题中提到了 JPA,因为之后我需要使用 JPA Criteria builder 编写此逻辑。所以我需要一些具有 JPA 2.0 支持的功能的解决方案。我的数据库是Oracle 11g,JDK版本是1.7.051。

【问题讨论】:

    标签: java sql oracle jpa


    【解决方案1】:

    我会倾向于使用窗口函数:

    SELECT col1, col5, col6
    FROM (SELECT v.*,
                 MAX(col5) OVER (PARTITION BY col1) as max_col5
          FROM TABLE v
          WHERE v.col1 = 'value' AND
                (v.col2 = 'bla' OR v.col3 = 'blabla' OR v.col4 = 'blaDiff')
         ) v
    WHERE v.col5 = v.max_col5;
    

    【讨论】:

    • 当有col1 = 'value'的过滤条件时,为什么要按col1进行分区?此外,OP 似乎希望输出中的所有六列,并且子查询中的 FROM 后面不应跟 TABLE 一词 - 这可能会引发语法错误。
    • @mathguy 。 . .因为如果 OP 将 = 更改为不等式会更安全。
    • 按预期工作!而且也很容易理解。谢谢,
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多