Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
Sql 将行与表中除前几行之外的每一行进行比较,我如何才能做到这一点?_Sql_Oracle - Fatal编程技术网

Sql 将行与表中除前几行之外的每一行进行比较,我如何才能做到这一点?

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加入

我如何编写一个查询来返回一对人的年龄之和。我想将当前行与数据库中除前几行之外的每一行进行比较?例如,我有一个Person表,该表有3条记录(在我的真实表中,我有更多记录)。第1人的年龄应与第2人和第3人进行比较,第2人应与第3人进行比较。如何在查询表单中实现这一点?

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

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就像一个包含行和列的表。这只是为了演示查询。您的实际查询将不包含它。请在实际查询中替换
人员