Select 列值和 SQL 中的下一个最高列值
Select column value and next highest column value in SQL
我有两列:userid 和 date_accessed。我想要第三列,对于每一行(每个用户 ID 和 date_accessed 组合),returns 是 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
但这行不通 — 谁能帮我理解为什么?
使用子查询,正确的语法是:
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;
请注意,列引用均使用其 table 名称限定。
如果你想要这个每个用户,你还需要一个相关的子句:
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;
我有两列:userid 和 date_accessed。我想要第三列,对于每一行(每个用户 ID 和 date_accessed 组合),returns 是 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
但这行不通 — 谁能帮我理解为什么?
使用子查询,正确的语法是:
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;
请注意,列引用均使用其 table 名称限定。
如果你想要这个每个用户,你还需要一个相关的子句:
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;