Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 在复杂查询上生成有序序列秩_Postgresql_Subquery - Fatal编程技术网

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;

似乎没有任何更多的性能影响(比20
COALESCE
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;