SQL上的条件减法

Posted

技术标签:

【中文标题】SQL上的条件减法【英文标题】:Conditional subtraction on SQL 【发布时间】: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?它总是会产生负值。 【参考方案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,所以它可能也适合您。

以上是关于SQL上的条件减法的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 同一字段上的多个 Where 条件

SQL优化,列列表上的条件会影响优化吗?

SQL 运算符

sql join 与列上的多个条件

SQL运算符

Sql 时间做条件