Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 - Fatal编程技术网

Sql 选择查询以查找差异

Sql 选择查询以查找差异,sql,Sql,我对sql相当陌生。我的问题是如何按字段分组,然后确定列中值之间的差异。比如说 索赔额 1. c3101 50000 2. c3101 19000 3. c1307 30000 4. c1307 14000 5. c3104 75000 6. c3104 0 7. c1313 5000 8. c1313 10000 预期结果 1. c3101 -31000 2. c1307 -26000 3. c1313 5000 我需要

我对sql相当陌生。我的问题是如何按字段分组,然后确定列中值之间的差异。比如说

索赔额

1. c3101    50000
2. c3101    19000
3. c1307    30000
4. c1307    14000
5. c3104    75000
6. c3104     0
7. c1313    5000
8. c1313   10000
预期结果

1. c3101    -31000
2. c1307     -26000
3. c1313     5000

我需要找出与索赔编号相关的金额差异。对于c3101,我从50000开始,到19000,所以到19000的交易是-31000。c3104将被忽略

您可以使用group by和sum来查找特定索赔的总值。 除非使用插入/默认顺序,否则无法查找差异,除非指定第一个索赔金额。 若我们知道哪一个是第一个,我们可以用其他的数减去

如果每个索赔只有两个条目,则可以得到第一个条目和最后一个条目之间的绝对差异

您还可以根据插入顺序获得非绝对差异:

select claim, (last(amount) - first(amount)) from claims group by claim;
使现代化 由于许多数据库不支持first和last,以下是备选方案:

MySQL

SQLFiddle:

MS SQL

对于MS SQL,由于从一个集合中获取底部的X条记录非常困难,因此我使用了平均值函数:

   SELECT claim, ((avg(amount)*2) -
                 (SELECT top 1 amount
                  FROM claims c2
                  WHERE c2.claim = c.claim))-
  (SELECT top 1 amount
   FROM claims c2
   WHERE c2.claim = c.claim)
FROM claims c
GROUP BY claim;
进一步简化为:

SELECT claim,
       2* ( avg(amount) -
             (SELECT top 1 amount
              FROM claims c2
              WHERE c2.claim = c.claim))
FROM claims c
GROUP BY claim;

SQL Fiddle:

每个索赔编号是否总是正好有2行?您正在使用什么RDBMS?第一个和最后一个是如何定义的?表中是否存在值为1、2、3、…8的列?如果是这样的话,它的名字是什么?你使用的是哪种RDBMS?@Christopher Robinson我提供了一个更新的答案,它使用MS SQl和MYSQL的默认顺序生成结果。不,每个声明可以有很多行;我正在使用access;第一个和最后一个没有定义;不只是行号;我尝试过嵌套查询,但不知道如何按索赔编号分组;我将尝试发布我已经尝试过的东西;等等…哪个RDBMS支持第一个和最后一个?这些不是必须是窗口函数吗?如果您选中,您将在SQL聚合函数部分看到它们。不幸的是,尽管我知道access支持它,这就是为什么我一直在用其他数据库的例子更新答案。。。但不幸的是,限制或获取顶部/底部的特定功能是特定于供应商的,因此语法会发生变化。@Jack Maney竭尽全力为两种最流行的DBs提供解决方案。。。尤其是数据缺少一个键。
   SELECT claim, ((avg(amount)*2) -
                 (SELECT top 1 amount
                  FROM claims c2
                  WHERE c2.claim = c.claim))-
  (SELECT top 1 amount
   FROM claims c2
   WHERE c2.claim = c.claim)
FROM claims c
GROUP BY claim;
SELECT claim,
       2* ( avg(amount) -
             (SELECT top 1 amount
              FROM claims c2
              WHERE c2.claim = c.claim))
FROM claims c
GROUP BY claim;