【问题标题】:Conditional subtraction on SQLSQL上的条件减法
【发布时间】:2019-08-30 11:28:30
【问题描述】:

我想写一个案例语句,从注册时间中减去应用登录和门户登录之间的最短日期时间。

我假设这将涉及一个案例陈述,但不知道如何写出来

我当前的代码是:

select case when first_app_login < first_portal_login
                then signup_complete - first_app_login
            when first_app_login > first_portal_login
                then signup_complete - first_portal_login
            else signup_complete - first_app_login
       end as signup_to_login
from database

但是这会返回以下错误消息:

错误:在 PortalSuspended 状态时协议序列“P”无效。 无标题图表

这是我的数据示例:

signup_complete               first_app_login     first_portal_login
2019-07-08 08:38:56.523                          2019-09-07 19:01:01.915
2019-05-10 12:24:11.704     2019-05-10 12:54:11.704   

想要的结果是第一行的 signup_complete - first_portal_login,第二行的 signup_complete - first_app_login。

所以我们只用非空值或 first_app 和 first_portal 登录之间的最低日期时间值减去 signup_complete

【问题讨论】:

  • 你的第一次是多余的。您不必在 Redshift 中使用 DATEDIFF 来计算日期时间差吗?
  • @emm 这个公式是否正确:signup_complete - first_app_loginsignup_complete - first_portal_login?它总是会产生负值。

标签: sql case amazon-redshift


【解决方案1】:

如果你想在天数内获得差异,你可以去。否则你必须在 DATEDIFF() 的第一个参数上加上“月”或“年”:

SELECT
CASE
    WHEN first_app_login < first_portal_login THEN 
        DATEDIFF(day, signup_complete, first_app_login)
    WHEN first_app_login > first_portal_login THEN 
        DATEDIFF(day, signup_complete, first_portal_login)
    ELSE DATEDIFF(day, signup_complete, (case
                                WHEN first_app_login IS NULL THEN
                                    first_portal_login
                                WHEN first_portal_login IS NULL THEN
                                    first_app_login
                                END))
END AS signup_to_login FROM [YOUR_TABLE_NAME]

如果您只是想像以前那样减去日期:

SELECT 
CASE
    WHEN first_app_login < first_portal_login THEN 
        signup_complete - first_app_login
    WHEN first_app_login > first_portal_login THEN 
        signup_complete - first_portal_login
    ELSE signup_complete - (case
                                WHEN first_app_login IS NULL THEN
                                    first_portal_login
                                WHEN first_portal_login IS NULL THEN
                                    first_app_login
                                END)
END AS signup_to_login FROM [YOUR_TABLE_NAME]

【讨论】:

  • 这个公式是否正确:signup_complete - first_app_loginsignup_complete - first_portal_login?它总是会产生负值。
  • 我个人不知道,我试图坚持这个问题,但你是对的,它会导致负值
【解决方案2】:

您可以使用LEAST 功能。 LEAST 函数的 documentation 声明它将“返回最小值并忽略 NULL 值”

SELECT LEAST(first_app_login, first_portal_login) - signup_complete as signup_to_login from dummy_table;

在这里,您可以在db<>fiddle 上看到 Postgres 8.4 DB 的实际应用。

【讨论】:

  • 我在 Postgres 数据库上测试它的原因是我无法访问 Amazon Redshift 数据库。其次,Amazon Redshift 也基于 PostgreSQL 8.0.2,所以它可能也适合您。
猜你喜欢
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多