将行与表中除前一行外的其他行进行比较,我该如何做到这一点



如何编写一个返回两个人年龄总和的查询。我想将当前行与数据库中除前一行外的其他行进行比较吗?例如,我有一个Person表,该表有3条记录(在我的真实表中,我有更多(。人员1的年龄应与人员2和人员3进行比较,人员2应与人员3进行对比。如何在查询表单中完成此操作?

您可以使用不等式join:生成包含所有值的行

select p1.*, p2.*
from person p1 join
person p2
on p1.id < p2.id;

@gordon linoff为连接编写的答案是正确的。它只是缺少总的计算。以下是如何完成总数(我不得不打开一个新的答案,因为我无法编辑戈登的答案,对不起(:

SELECT 
p1.id
, p1.name
, p2.id
, p2.name
, (p1.age + p2.age) TotalAge
FROM 
person p1 
JOIN person p2  ON  p1.id < p2.id;

这将比较[pperson.id=1与person.id=2,3,4,…],[pperson.iid=2与person.iid=3,4…]等等。最后一个p1.id将不会以这种方式进行比较,因为没有更大的p2.id(但该人将作为p2.id包括在所有其他比较中,因为它比所有其他人都大(。这应满足要求的匹配/连接要求。

每当您想要进行此类比较时,都会假设您已经定义了顺序。在这种情况下,似乎是个人ID是顺序。

您可以将分析函数与windowing子句一起使用,以获得所需的结果。您使用SUM作为分析函数,并根据您的顺序考虑下一行到最后一行之间的行窗口。

因此,查询变成

WITH
persons
AS
(SELECT 1 AS personid, 'Person 1' AS name, 23 AS age FROM DUAL
UNION
SELECT 2 AS personid, 'Person 2' AS name, 34 AS age FROM DUAL
UNION
SELECT 3 AS personid, 'Person 3' AS name, 30 AS age FROM DUAL
UNION
SELECT 4 AS personid, 'Person 4' AS name, 28 AS age FROM DUAL)
SELECT personid,
name,
SUM (age)
OVER (ORDER BY personid ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)
AS subsequent_sum_age
FROM persons;

ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING是您的windowing子句,它告诉Oracle要考虑哪些行进行求和。

结果是

PERSONID   NAME       AGE  SUBSEQUENT_SUM_AGE
1        Person 1    23     92
2        Person 2    34     58
3        Person 3    30     28
4        Person 4    28  

最新更新