【问题标题】:how to set Boolean value per row based on condition如何根据条件设置每行的布尔值
【发布时间】:2020-04-23 13:34:51
【问题描述】:

我想根据role_end_date 在我的表上设置名为is_last_status 的列

例如:

示例 1:

role_end_date role_start_date   row_id     id is_last_status

null           2020-02-08   7_2020-02-08    7   true

2020-02-07     2019-11-05   7_2019-11-05    7   false

2019-11-05     2019-07-16   7_2019-07-16    7   false

2019-07-16     2019-05-28   7_2019-05-28    7   false

2019-05-24     2019-04-24   7_2019-04-24    7   false

示例 2:

role_end_date role_start_date   row_id     id is_last_status

2020-04-01     2020-02-08   6_2020-02-08    6   true

2020-01-01     2020-01-01   6_2020-01-01    6   false

我似乎找不到可以生成 is_last_status 的 SQL,我在处理这些空白时遇到了困难。

逻辑是: is_last_status = True 只能有 1 行。 它应该是基于role_start_date的表中的最新行

所以在这两个例子中,最近的一行都是role_start_date = '2020-02-08' 基本上,如果该行有 role_start_date=Max(role_start_date) 将 is_last_status 设置为 True,则其余为 false。 role_start_dateid 中是唯一的。

我应该是这样的:

SELECT
    role_end_date
    ,role_start_date
    ,row_id
    ,id
    ,LEAD(role_start_date) OVER (PARTITION BY id ORDER BY role_end_date) as is_last_status
FROM my_table

我正在使用 Presto

【问题讨论】:

  • 你是如何计算is_last_status的?
  • @zealous 查看编辑

标签: sql presto


【解决方案1】:

使用row_number()尝试以下操作

select
        role_end_date
        ,role_start_date
        ,row_id
        ,id
        ,case when rnk = 1 then 'true' else 'false' end as is_last_status
from
(
    select
        role_end_date
        ,role_start_date
        ,row_id
        ,id
        ,row_number() over (partition by id order by role_start_date desc) as rnk
    from my_table
) val
order by
    role_start_date desc

【讨论】:

  • 我想到了这个。肯定会工作我想知道是否有更简单的方法来做到这一点。
  • @HaloKu 根据我的想法,使用row_number() 是最好的方法。如果这对您有用,那么请点击勾选标记接受它。谢谢
  • 你认为这可以合并为 1 个查询,这样就不需要两个 SELECT 了吗?
  • @HaloKu 我不这么认为。对此感到抱歉。
猜你喜欢
  • 2019-07-31
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2011-12-08
  • 2016-11-08
相关资源
最近更新 更多