Postgresql:根据布尔列在两个相似的行之间进行选择

时间:2013-12-31 14:26:43

标签: sql postgresql

我有一个表,它是系统中每个项目的列表。有一列说明该项目是否为默认项目。在查询中,我将浏览项目并选择具有与之关联的MSDS的项目,但是我的查询会返回相同项目编号的多个项目,因为项目存在多个记录。

所以我想做的是将结果限制为默认项目。通常我会做WHERE itemsrc.itemsrc_default,但是并不是每个项目都设置了默认记录,所以我要做的就是通过表格,如果项目存在默认记录而不是优先考虑该项目,否则,如果不存在默认记录,则返回该项目编号的第一条记录。

我不确定我是否会在主查询的WHERE子句中将其作为子查询执行,或者我是否应该创建检查默认值的函数。

2 个答案:

答案 0 :(得分:2)

您可以使用DISTINCT ON

SELECT  DISTINCT ON (ItemID) ItemID, itemsrc_default, Column1, Column2 
FROM    itemsrc
ORDER BY ItemID, itemsrc_default DESC, Column1, Column2;

来自文档:

  

DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。请注意,除非使用ORDER BY确保首先显示所需的行,否则每个集合的“第一行”都是不可预测的。

<强> Simple Demo on SQL Fiddle

您还可以使用ROW_NUMBER()

获得相同的结果
SELECT  *
FROM    (   SELECT  ...,
                    ROW_NUMBER() OVER(PARTITION BY ItemID ORDER BY itemsrc_default DESC, SomeCol) AS RowNum
            FROM    itemsrc
        ) i
WHERE   RowNum = 1;

<强> Example using ROW_NUMBER

答案 1 :(得分:0)

SELECT *
FROM itemsrc src
WHERE itemsrc_default = True
OR NOT EXISTS (
    SELECT * FROM itemsrc nx
    WHERE nx.itemId = src.itemID
    AND nx.key_column < src.key_column
    );