【问题标题】:Postgres distinct case statement with window function具有窗口函数的 Postgres 不同的 case 语句
【发布时间】:2014-08-24 13:02:30
【问题描述】:

我希望使用一个 case 语句,该语句将为我列出的每个唯一 ID 返回一次数字 1,如果 ID 与上面的 ID 相同,则返回 0。该列是当前具有“N”或“Y”的文本列。

以下是我的数据的示例。我希望它尽可能简短,因为这将在其他 SQL 中使用。

SQL:select case when Value = 'Y' then 1 else 0 end

返回:

ID      Value
48719   Y      -- returns 1
48719   Y      -- returns 1
48719   Y      -- returns 1 
55555   Y      -- returns 1

我想看什么。

ID      Value
48719   Y      -- return 1
48719   Y      -- return 0
48719   Y      -- return 0
55555   Y      -- return 1

编辑

这也是一种可能的情况。对于第一个 ID,我想让三行中的任何一行返回 1,但其他两行显示 0。由于 case 语句会为第一行返回 0,我可以让它只选择一个 1对于具有该 ID 的所有行。

ID      Value
48719   N      -- returns 1
48719   Y      -- returns 0
48719   Y      -- returns 0 
55555   Y      -- returns 1

【问题讨论】:

  • 您假设行的特定顺序,但 SQL 表表示无序集。你有一个单独的列来指定行的顺序吗?
  • 不,这是我的问题。我打算计算使用它来选择的行号,但它并不总是需要选择的同一行。因此,我只想为每个唯一 ID 显示 1 一次。
  • 在这种情况下,@ClodoaldoNeto 的解决方案应该可以满足您的需求。您需要为其添加一个order by 子句,因此它的部分内容为partition by id order by id

标签: sql postgresql case distinct-values


【解决方案1】:
select
    id, value,
    (
        row_number() over(partition by id) = 1
    )::integer as returned_value
from t

【讨论】:

  • 抱歉,我还应该展示另一种可能性。
  • @user3780646 我编辑了答案。但我不明白value 列与问题有什么关系。
猜你喜欢
  • 2022-08-18
  • 2018-08-10
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2018-07-01
相关资源
最近更新 更多