如何仅在符合条件的情况下检索具有最大值的行,否则不应返回任何内容

时间:2015-03-12 11:55:39

标签: sql

请求会搜索具有固定' id'的对象。只有版本较高的行'应该返回(最新版本)。但是如果较高版本已删除'那么根本不应返回任何行。列真实。

示例:

|id    |version   |deleted |
|0     |1         |false   |
|0     |2         |false   |
|1     |1         |false   |
|1     |2         |false   |
|1     |3         |true    |

id 0的请求应该返回

|1     |2         |false   |

但是id 1的请求应该不返回任何内容

我可以用INTERSECT做到这一点:

SELECT id, version, deleted FROM elements WHERE id = 1 AND deleted = 'false'
INTERSECT
SELECT id, MAX(version), deleted FROM elements WHERE id = 1 

但有更好的方法吗?

3 个答案:

答案 0 :(得分:0)

我倾向于用子查询做到这一点:

select e.*
from (select id, version, deleted
      from elements
      where id = 1
      order by version desc
      limit 1
     ) e
where deleted = 'false';

id最多返回一行。只有在delete = 'false'

时,它才会返回具有最高版本的行

答案 1 :(得分:0)

这可以通过使用Row_number()功能实现,方法是根据版本对行进行排序,并使用版本最大的行并使用WHERE子句忽略deleted <> false

的行
select id, version, deleted from (
select id, version, deleted, row_number() over 
(partition by id order by version desc) where deleted = 'false'
) A where rown = 1

答案 2 :(得分:0)

我会选择:

WITH src AS ( -- subquery gets the newest version for each of the ids
    SELECT DISTINCT ON (id)
        *
    FROM testtab 
    ORDER BY id, version DESC
)
SELECT * FROM SRC
WHERE NOT deleted -- or deleted = 'false' depending on it's type
    AND id = 0 -- your id goes here