Postgresql 在复杂查询上生成有序序列秩
我试图在查询的输出中创建一个隐式秩。问题似乎是在计算Postgresql 在复杂查询上生成有序序列秩,postgresql,subquery,Postgresql,Subquery,我试图在查询的输出中创建一个隐式秩。问题似乎是在计算worth之前运行了row\u number() SELECT firstname, lastname, personid, year, ( SELECT COALESCE(SUM(thevalue),0) FROM assets WHERE personidref = w.personid AND year = w.year ) AS assets ,
worth
之前运行了row\u number()
SELECT
firstname,
lastname,
personid,
year,
(
SELECT COALESCE(SUM(thevalue),0)
FROM assets WHERE personidref = w.personid AND year = w.year
) AS assets ,
(
SELECT COALESCE(SUM(amount),0)
FROM liabilities WHERE personidref = w.personid AND year = w.year
) AS liabilities,
(
(SELECT COALESCE(SUM(thevalue),0)
FROM assets
WHERE personidref = w.personid AND year = w.year)
-
(SELECT COALESCE(SUM(amount),0)
FROM liabilities
WHERE personidref = w.personid AND year = w.year)
) as worth,
row_number() over(ORDER BY w.worth) as rank
FROM members w
WHERE year = 2012
ORDER BY worth DESC LIMIT 2;
结果是我得到了这个:
| firstname | lastname | personid | year | assets | liabilities | worth | rank |
+-----------+----------+----------+------+--------+-------------+-------+------+
| foo | bar | 234 | 2012 | 30000 | 20 | 29980 | 32 |
| foo2 | bar2 | 5234 | 2012 | 30000 | 100 | 29900 | 69 |
而不是期望的输出:
| firstname | lastname | personid | year | assets | liabilities | worth | rank |
+-----------+----------+----------+------+--------+-------------+-------+------+
| foo | bar | 234 | 2012 | 30000 | 20 | 29980 | 1 |
| foo2 | bar2 | 5234 | 2012 | 30000 | 100 | 29900 | 2 |
有没有办法预运行此查询并按排名第一进行预排序?将行数加倍()如何
没有样本数据很难确定,但如果你想要排名
或
?
这是我认为你可能想要做的。未测试,因为没有样本数据或可用于测试,但:
SELECT
*,
dense_rank() OVER (ORDER BY worth)
FROM
(
SELECT
*,
assets - liabilities AS worth
FROM
(
SELECT
firstname,
lastname,
personid,
year,
(
SELECT COALESCE(SUM(a.thevalue),0)
FROM assets a WHERE a.personidref = w.personid AND a.year = w.year
) AS assets ,
(
SELECT COALESCE(SUM(l.amount),0)
FROM liabilities l WHERE l.personidref = w.personid AND l.year = w.year
) AS liabilities
FROM members w
WHERE year = 2012
) AS a_and_l
) AS net_worths
ORDER BY worth DESC
LIMIT 2;
似乎没有任何更多的性能影响(比20COALESCE
s更多),这非常有效!将您的查询重新格式化为易读。您的第一个资产查询是否缺少一个年度筛选器?顺便说一句,为了获得更好的性能,您可能实际上需要另一个级别的子查询,因此您可以按值描述限制2排序,然后才可以密集排列()
匹配行。在上面的例子中,您可能会在所有行上进行密集排序()
,然后扔掉大部分。
rank() over(ORDER BY w.worth) as rank
dense_rank() over(ORDER BY w.worth) as rank
SELECT
*,
dense_rank() OVER (ORDER BY worth)
FROM
(
SELECT
*,
assets - liabilities AS worth
FROM
(
SELECT
firstname,
lastname,
personid,
year,
(
SELECT COALESCE(SUM(a.thevalue),0)
FROM assets a WHERE a.personidref = w.personid AND a.year = w.year
) AS assets ,
(
SELECT COALESCE(SUM(l.amount),0)
FROM liabilities l WHERE l.personidref = w.personid AND l.year = w.year
) AS liabilities
FROM members w
WHERE year = 2012
) AS a_and_l
) AS net_worths
ORDER BY worth DESC
LIMIT 2;