如何按两个日期中较早/较早的日期对 SQL 结果进行排序?

时间:2021-01-13 09:31:32

标签: mysql sql sql-order-by

假设一个包含三个字段的简单表:一个 user_id 和两个日期 last_loginlast_api_usage

我想通过按两个日期中较早的日期对表格进行排序来查找不活动的用户。示例:

 user_id    | last_login    | last_api_usage
------------+---------------+----------------
 1          | 2020-06-01    | NULL
 2          | 2020-09-01    | 2020-03-01
 3          | 2020-05-01    | 2020-08-01

Result order: 2, 3, 1

用户 2 是最活跃的,因为虽然他有一段时间没有使用 API,但登录时间是 9 月。由于 8 月份的 API 使用,接下来是用户 3。

当然,按两个日期对结果进行排序没有问题 (...ORDER BY last_login, last_api_usage DESC),但这会返回结果 2, 1, 3 而不是预期的结果。

如何按两个日期的较早/顺序排序?

3 个答案:

答案 0 :(得分:4)

您可以按如下方式使用 leastcoalesce 函数:

ORDER BY least(last_login, coalesce(last_api_usage,last_login))

答案 1 :(得分:0)

你的 RDBMS 是什么?

rrapply(mylist, how = "melt")

    L1   L2    L3  value
1 lois hair color orange
2 lois hair  form   flat
3 lois  sex  <NA> female

或使用合并函数

谢谢。

答案 2 :(得分:0)

OP 您可以 union all 取消旋转该列,然后对其进行排序。 例如:

select * from (
select user_id,use_date ,row_number()over(partition by user_id order by use_date desc) rn from (
select user_id, last_login as use_date
from [TABLE] 
union all
select user_id,last_api_usage
from [TABLE] 
) a ) b
where rn = 1
order by use_date

逻辑很简单,将两列合并为一列,然后过滤具有最大date的行,在以下超链接中,我没有为伪数据使用正确的日期格式,但想法是相同的。
这里是 db<>fiddle 以便更好地检查。

相关问题