首页 > 解决方案 > 在 SQL 中选择列值和下一个最高列值

问题描述

我有两列:userid 和 date_accessed。我想要第三列,对于每一行(每个用户 ID 和 date_accessed 组合),返回 date_accessed 的下一个最高日期。现在我的查询是这样的:

SELECT 
   userid, 
   date_accessed AS first_date,
   (SELECT date_accessed
    FROM table
    WHERE date_accessed > first_date
    ORDER BY date_accessed ASC
    LIMIT 1) AS second_date
FROM table

但这不起作用 - 有人可以帮我理解为什么吗?

标签: sqlsubquerypresto

解决方案


使用子查询,正确的语法是:

SELECT t.userid, t.date_accessed AS first_date,
       (SELECT t2.date_accessed
        FROM table t
        WHERE t2.date_accessed > t.date_accessed
        ORDER BY t2.date_accessed ASC
        LIMIT 1
       ) AS second_date
FROM table t;

请注意,列引用都使用它们的表名来限定。

如果您希望每个用户都这样做,则还需要一个相关子句:

SELECT t.userid, t.date_accessed AS first_date,
       (SELECT t2.date_accessed
        FROM table t
        WHERE t2.userid = t.userid AND t2.date_accessed > t.date_accessed
        ORDER BY t2.date_accessed ASC
        LIMIT 1
       ) AS second_date
FROM table t;

如果日期是唯一的,您可以使用LEAD()

select t.*,
       lead(date_accessed) over (partition by userid order by date_accessed)
from t;

推荐阅读