Sql 将行与表中除前几行之外的每一行进行比较,我如何才能做到这一点?
我如何编写一个查询来返回一对人的年龄之和。我想将当前行与数据库中除前几行之外的每一行进行比较?例如,我有一个Person表,该表有3条记录(在我的真实表中,我有更多记录)。第1人的年龄应与第2人和第3人进行比较,第2人应与第3人进行比较。如何在查询表单中实现这一点?您可以使用不等式Sql 将行与表中除前几行之外的每一行进行比较,我如何才能做到这一点?,sql,oracle,Sql,Oracle,我如何编写一个查询来返回一对人的年龄之和。我想将当前行与数据库中除前几行之外的每一行进行比较?例如,我有一个Person表,该表有3条记录(在我的真实表中,我有更多记录)。第1人的年龄应与第2人和第3人进行比较,第2人应与第3人进行比较。如何在查询表单中实现这一点?您可以使用不等式连接生成包含所有值的行: select p1.*, p2.* from person p1 join person p2 on p1.id < p2.id; 选择p1.*,p2* 从p1加入
连接生成包含所有值的行:
select p1.*, p2.*
from person p1 join
person p2
on p1.id < p2.id;
选择p1.*,p2*
从p1加入
人p2
p1.id
您可以使用不等式连接生成包含所有值的行
:
select p1.*, p2.*
from person p1 join
person p2
on p1.id < p2.id;
选择p1.*,p2*
从p1加入
人p2
p1.id
@gordon linoff所写的关于加入的答案是正确的。只是没有计算出总数。下面是如何完成总数(我不得不打开一个新答案,因为我无法编辑Gordon的答案,对不起):
选择
p1.id
,p1.name
,p2.id
,p2.name
,(p1.年龄+p2.年龄)总年龄
从…起
人p1
在p1.id
这将比较[person.id=1与person.id=2,3,4,…],[person.id=2与person.id=3,4,…]等等。最后一个p1.id将不会以这种方式进行比较,因为没有更大的p2.id(但该人将作为p2.id包含在所有其他比较中,因为它比所有其他人都大)。这应该满足要求的匹配/加入要求。作为加入答案的@gordon linoff所写内容是正确的。只是没有计算出总数。下面是如何完成总数(我不得不打开一个新答案,因为我无法编辑Gordon的答案,对不起):
选择
p1.id
,p1.name
,p2.id
,p2.name
,(p1.年龄+p2.年龄)总年龄
从…起
人p1
在p1.id
这将比较[person.id=1与person.id=2,3,4,…],[person.id=2与person.id=3,4,…]等等。最后一个p1.id将不会以这种方式进行比较,因为没有更大的p2.id(但该人将作为p2.id包含在所有其他比较中,因为它比所有其他人都大)。这应该满足所要求的匹配/加入要求。每当您想要进行此类比较时,都假定您定义了订单。在这种情况下,订单上显示的似乎是person ID
您可以将分析函数与windowing子句一起使用,以获得所需的结果。
您使用<代码>和> /COD>作为解析函数,并将下一行之间的行窗口视为按顺序排列的最后一行。
因此,查询变得非常简单
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;
<> >代码> 1行以下与无界跟随< /代码>之间的行是你的窗口子句,它告诉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
每当您想要进行此类比较时,都假定您定义了一个顺序。在这种情况下,订单上显示的似乎是person ID
您可以将分析函数与windowing子句一起使用,以获得所需的结果。
您使用<代码>和> /COD>作为解析函数,并将下一行之间的行窗口视为按顺序排列的最后一行。
因此,查询变得非常简单
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;
<> >代码> 1行以下与无界跟随< /代码>之间的行是你的窗口子句,它告诉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
“比较”是什么意思?样本数据和期望的结果会有所帮助。这实际上不是一个比较,但我需要一对人来得到两个年龄,然后我将这两个年龄应用到一个总和公式中。你能分享这个表格的细节吗?person=>Iderson,age,Name“比较”是什么意思?样本数据和期望的结果会有所帮助。这实际上不是一个比较,但我需要一对人来得到两个年龄,然后我将这两个年龄应用到一个求和公式中。你能分享表格person=>Iderson,age,Name的详细信息吗?这将比较p1与p2和p3?这将比较[person.id=1与person.id=2,3,4,…],[person.id=2,person.id=3,4,…]等等。最后一个person.id将不会以这种方式进行比较,因为没有其他person.id。这应该满足要求的匹配/加入要求。@k4m是的,这是有意义的,尽管问题说OP想要“一对人的年龄总和”。所以我假设OP想要比较的是2组。Well,似乎主要的挑战是连接逻辑。既然已经完成了,剩下的应该是一个简单的和,可能像这样select p1.id,(p1.age+p2.age)TotalAge from…..
这一切都取决于“和”的方式定义,这在问题中不清楚。这将比较p1与p2和p3。这将比较[person.id=1与person.id=2,3,4,…],[person.id=2与person.id=3,4,…]依此类推。最后一个person.id不会以这种方式进行比较,因为没有其他person.id。这应该满足要求的匹配/加入要求。@k4m是的,这是有道理的,尽管问题说OP想要“一对人的年龄总和”。所以我假设OP想要比较的是2组。Well,似乎主要的挑战是连接逻辑。既然已经完成了,剩下的应该是一个简单的和,可能像这样select p1.id,(p1.age+p2.age)TotalAge from…..
这一切都取决于“和”的方式定义了,这在问题中不清楚谢谢,但我的表中有4个人,我需要为每个人分别定义一个联合吗?WITH语句和union用于模拟一个包含一些行的表。在这种情况下,persons就像一个包含行和列的表。这只是为了演示查询。您的实际查询将不包含它。请在实际查询中替换人员