Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL上的条件减法_Sql_Case_Amazon Redshift - Fatal编程技术网

SQL上的条件减法

SQL上的条件减法,sql,case,amazon-redshift,Sql,Case,Amazon Redshift,我想写一个案例陈述,从注册时间中减去应用程序登录和门户登录之间的最低日期时间 我假设这将涉及一个案例陈述,但不确定如何写出来 我目前的代码是: select case when first_app_login < first_portal_login then signup_complete - first_app_login when first_app_login > first_portal_login

我想写一个案例陈述,从注册时间中减去应用程序登录和门户登录之间的最低日期时间

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

我目前的代码是:

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
期望的结果是第一行的注册完成-第一行的门户登录,第二行的注册完成-第一行的应用登录


因此,如果您想在接下来的几天中获得差异,我们只需减去第一个应用程序和第一个门户登录之间的非空值或最低日期时间值来完成注册。否则,必须在DATEDIFF()的第一个参数上加上“月”或“年”:

选择
案例
当第一次应用程序登录<第一次门户登录
DATEDIFF(日期、注册完成、首次应用程序登录)
当第一次应用程序登录>第一次门户登录时
DATEDIFF(天,注册完成,第一次登录)
ELSE DATEDIFF(天,注册完成)(案例
当第一个应用程序登录为空时
第一次\u门户\u登录
当第一个\u门户\u登录为空时
第一次应用程序登录
完)
以从[您的\u表\u名称]注册到\u登录结束
如果您只想在执行时减去日期:

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]
选择
案例
当第一次应用程序登录<第一次门户登录
注册完成-第一次应用程序登录
当第一次应用程序登录>第一次门户登录时
注册\u完成-第一个\u门户\u登录
否则注册完成-(案例)
当第一个应用程序登录为空时
第一次\u门户\u登录
当第一个\u门户\u登录为空时
第一次应用程序登录
(完)
以从[您的\u表\u名称]注册到\u登录结束

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

选择
案例
当第一次应用程序登录<第一次门户登录
DATEDIFF(日期、注册完成、首次应用程序登录)
当第一次应用程序登录>第一次门户登录时
DATEDIFF(天,注册完成,第一次登录)
ELSE DATEDIFF(天,注册完成)(案例
当第一个应用程序登录为空时
第一次\u门户\u登录
当第一个\u门户\u登录为空时
第一次应用程序登录
完)
以从[您的\u表\u名称]注册到\u登录结束
如果您只想在执行时减去日期:

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]
选择
案例
当第一次应用程序登录<第一次门户登录
注册完成-第一次应用程序登录
当第一次应用程序登录>第一次门户登录时
注册\u完成-第一个\u门户\u登录
否则注册完成-(案例)
当第一个应用程序登录为空时
第一次\u门户\u登录
当第一个\u门户\u登录为空时
第一次应用程序登录
(完)
以从[您的\u表\u名称]注册到\u登录结束

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


在这里,您可以看到它在Postgres 8.4 DB上的作用。

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


在这里,您可以看到它在Postgres 8.4 DB的情况下发挥作用。

您的第一个时间是多余的。你不需要在红移中使用
DATEDIFF
来计算日期时间差吗?@emm这个公式正确吗:
signup\u complete-first\u app\u login
signup\u complete-first\u portal\u login
?它总是会产生负值。你的第一个时间是多余的。你不需要在红移中使用
DATEDIFF
来计算日期时间差吗?@emm这个公式正确吗:
signup\u complete-first\u app\u login
signup\u complete-first\u portal\u login
?我在Postgres数据库上测试它的原因是我没有访问亚马逊红移数据库的权限。其次,Amazon Redshift也是基于PostgreSQL 8.0.2的,所以它可能也适用于您。我在Postgres数据库上测试它的原因是我没有访问Amazon Redshift数据库的权限。其次,Amazon Redshift也是基于PostgreSQL 8.0.2的,所以它可能也适用于您。这个公式正确吗:
signup\u complete-first\u app\u login
signup\u complete-first\u portal\u login
?我个人不知道,我试图坚持这个问题,但你是对的,它会导致负值。这个公式正确吗:
signup\u complete-first\u app\u login
signup\u complete-first\u portal\u login
?我个人不知道,我试着坚持问题是什么,但你是对的,这将导致一个负值
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]
SELECT LEAST(first_app_login, first_portal_login) - signup_complete as signup_to_login from dummy_table;