【发布时间】:2019-03-27 18:32:22
【问题描述】:
我正在尝试显示多个内容,例如用户 ID、薪水等。 我使用了一个 select 语句来做到这一点。在这个 select 语句中,我需要使用另一个 select 语句来提供“工资的分数”。分数的查询是正确的。当我尝试将此选择用于主选择时,它会给出错误“超过一行返回...” 样本数据:
//sample data
insert into employee(id_user int,salary_date date,salary_value) values
(3, 2017-06-28, 15)
( 5, 2017-06-26 5)
( 2, 2017-06-20 5)
( 1, 2017-06-20 15)
( 4, 2017-06-17 25)
//expected output:
id date sal newdate days aboveavgsal date current/firstsal
1 2017-06-20 15 2017-05-20 31 N 2017-04-20 0.6
1 2017-05-20 10 2017-04-20 30 N 2017-04-20 0.4
1 2017-04-20 20 2017-03-20 31 Y 2017-03-20 0.8
1 2017-03-20 20 2017-02-20 28 Y NULL 0.8
1 2017-02-20 15 NULL NULL N NULL 0.6
SELECT id_user
, salary_date
, salary_value
, lead(salary_date) OVER(PARTITION BY id_user ORDER BY salary_date desc)
, salary_date::timestamp - lead(salary_date::timestamp) over (PARTITION BY id_user ORDER BY salary_date DESC)
, CASE WHEN salary_value >= 20 THEN 'Y' ELSE 'N' END
, CASE WHEN salary_value >= 20 THEN lead(salary_date) OVER(PARTITION BY id_user ORDER BY salary_date DESC) END
, (SELECT CAST(t1.salary_value AS float) / CAST(t.salary_value AS float)
FROM (
SELECT t.id_user
, t.salary_value
, ROW_NUMBER() OVER(PARTITION BY t.id_user ORDER BY t.salary_date) AS rowrank
FROM employee t
) AS t
INNER JOIN employee AS t1 ON t1.id_user = t.id_user
WHERE t.rowrank = 1
GROUP BY t1.id_user, t1.salary_value, t1.salary_date, t.salary_value, t.rowrank
ORDER BY t1.id_user, t1.salary_date DESC
) AS fraction
FROM employee
Error starts in this query which i tried enclosing in braces.
(SELECT CAST(t1.salary_value AS float) / CAST(t.salary_value AS float)
FROM (
SELECT t.id_user
, t.salary_value
, row_number() OVER(PARTITION BY t.id_user ORDER BY t.salary_date ) AS rowrank
FROM employee t) AS t
INNER JOIN employee t1 ON t1.id_user = t.id_user
WHERE t.rowrank = 1
GROUP BY t1.id_user, t1.salary_value, t1.salary_date, t.salary_value, t.rowrank
ORDER BY t1.id_user, t1.salary_date DESC
)
【问题讨论】:
-
尝试通过独立运行子查询来调试,看看它是否返回多行。
-
此外,似乎没有任何条件将主查询表链接到该子查询以隔离与该主查询链接的一行......所以那里一定缺少一些东西。您是否希望将该子查询链接到主查询而不是使用子查询。
-
子查询返回多行,所以不能出现在
SELECT列表中。也许你可以把它放在FROM子句中? -
而且这有点主观,但是对于这种更复杂的查询,我会非常倾向于写一个更清晰的方式,一切都打包在一起。我在本地这样做只是为了了解发生了什么。在其他问题解决后,我可以建议一种方法来写这篇文章。
-
@MichaelMuryn 是的,我单独运行了查询。它工作正常。它只返回与另一个选择查询具有相同行的一列。
标签: sql postgresql subquery window-functions