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_login
或 signup_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_login
或 signup_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上的条件减法的主要内容,如果未能解决你的问题,请参考以下文章