【发布时间】:2019-03-27 21:22:48
【问题描述】:
我有两个疑问。它们都返回大约 60 行。但加入它们后,它们返回 900 行。有没有办法在加入它们时获得 60 行。
查询 1:
SELECT
f.id_user,
f.topup_date,
f.topup_value,
LEAD(f.topup_date) OVER (PARTITION BY(f.id_user) ORDER BY f.topup_date DESC),
f.topup_date::timestamp - LEAD(f.topup_date::timestamp) OVER (PARTITION BY(f.id_user) ORDER BY f.topup_date DESC),
CASE WHEN f.topup_value >= 20 THEN 'Y' ELSE 'N' end,
CASE WHEN f.topup_value >= 20 THEN LEAD(f.topup_date) OVER (PARTITION BY (f.id_user) ORDER BY f.topup_date DESC) END
FROM topups AS f
查询 2:
SELECT
CAST(t2.topup_value as float)/CAST(t1.topup_value as float)
FROM (
SELECT
t1.id_user,
t1.topup_value,
ROW_NUMBER() OVER (PARTITION BY t1.id_user ORDER BY t1.topup_date ) AS rowrank
FROM topups t1
) AS t1
INNER JOIN topups t2 ON t1.id_user=t2.id_user
WHERE t1.rowrank = 1
GROUP BY
t2.id_user,
t2.topup_value,
t2.topup_date,
t1.topup_value,
t1.rowrank
ORDER BY
t2.id_user,
t2.topup_date DESC
加入查询:
SELECT
f.id_user,
f.topup_date,
f.topup_value,
LEAD(f.topup_date) OVER (PARTITION BY(f.id_user) ORDER BY f.topup_date DESC),
f.topup_date::timestamp - LEAD(f.topup_date::timestamp) OVER (PARTITION BY(f.id_user) ORDER BY f.topup_date DESC),
CASE WHEN f.topup_value >= 20 then 'Y' ELSE 'N' END,
CASE WHEN f.topup_value >= 20 THEN LEAD(f.topup_date) OVER (PARTITION BY (f.id_user) ORDER BY f.topup_date desc) END,
CAST(t2.topup_value AS float)/CAST(t1.topup_value AS float)
FROM (
SELECT
t1.id_user,
t1.topup_value,
ROW_NUMBER() OVER (PARTITION BY t1.id_user ORDER BY t1.topup_date ) AS rowrank
FROM topups t1
) AS t1
INNER JOIN topups t2 ON t1.id_user = t2.id_user
INNER JOIN topups f ON f.id_user = t2.id_user
WHERE t1.rowrank = 1
GROUP BY
f.id_user,
f.topup_date,
f.topup_value,
t2.topup_value,
t1.topup_value,
t2.id_user,
t2.topup_date
ORDER BY
t2.id_user,
t2.topup_date DESC,
f.id_user,
f.topup_date DESC
【问题讨论】:
-
你为什么只加入
id_user?你不应该加入完整的topups键吗?顺便说一句,您的第二个查询看起来很奇怪。GROUP BY子句有什么用?我看不到聚合(SUM、COUNT等)。 -
我完全重新设计了您的 SQL 查询以使其可读。请考虑为您的下一个问题使用相同的格式规则!问题会很长且未格式化的 SQL 代码通常很少受到社区的关注...
-
@GMB 非常感谢..下次我会记住的
-
@ThorstenKettner 我只是想加入这两个查询,所以我使用了 id_user。关于第二个查询,我需要根据每个用户 ID 以特定顺序输出某些列。我猜它没有真正的意义。我会删除它。
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码加上所需的输出加上清晰的规范和解释。最小意味着将最少的问题代码添加到最少的工作代码中。因此,给出你所展示的最少代码,并在你出错的第一个地方提供最少的代码。 (调试基础。)请通过编辑而不是 cmets 进行澄清。 PS你甚至没有解释或说明你想要什么结果。 “在加入时获得 60 行”尚不清楚。 “只是想加入这两个查询”告诉我们什么。准确告诉我们一行在结果中的含义。
标签: sql postgresql join window-functions