Sql 如何从同一表格中的另一行中减去一行?

Sql 如何从同一表格中的另一行中减去一行?,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,伙计们,我有两个名为Requisition和requisionhistory的表。表请购单是一个主要表,其中唯一的条目基于请购单代码(PK),但在表请购单历史记录中,有多行基于请购单代码,因为每次对请购单表执行任何操作(如更新等),将在请购单历史记录中插入一个新条目 这是我的requision表 +-----------------+---------------+--------------------+ | RequisitionCode | ApprovedCount | Requisit

伙计们,我有两个名为
Requisition
requisionhistory
的表。表
请购单
是一个主要表,其中唯一的条目基于
请购单代码
(PK),但在表
请购单历史记录
中,有多行基于
请购单代码
,因为每次对
请购单
表执行任何操作(如更新等),将在
请购单历史记录
中插入一个新条目

这是我的
requision

+-----------------+---------------+--------------------+
| RequisitionCode | ApprovedCount | RequisitionDate    |
+-----------------+---------------+--------------------+
|               1 |            10 | 02/01/2014         |
|               2 |            23 | 01/01/2014         |
|               3 |             3 | 02/01/2014         |
+-----------------+---------------+--------------------+
这是我的
requisionhistory

+------------------------+-----------------+---------------+-----------------+
| RequisitionHistoryCode | RequisitionCode | ApprovedCount | RequisitionDate |
+------------------------+-----------------+---------------+-----------------+
|                      1 |               1 |            14 | 01/01/2014      |
|                      2 |               1 |            10 | 02/01/2014      |
|                      3 |               2 |            23 | 01/01/2014      |
|                      4 |               3 |             1 | 01/01/2014      |
|                      5 |               3 |             3 | 02/01/2014      |
+------------------------+-----------------+---------------+-----------------+
这些表中还有其他列,但是对于我的查询,它们是不相关的,因此不包括它们

现在我想做的是从
requisionhistory
中获取每个
requisioncode
的最新(基于
requisiondate
ApprovedCount
,然后从同一
requisioncode
的第二个最后条目的
ApprovedCount
中减去它(在
requisionhistory
中,该
requisioncode
可能有一个或多个条目)

我想做的事(但失败得很惨)


我做错了什么?

当您尝试以下方法时,您会得到什么:

select RequisitionCode ,
(
ISNULL((select top 1 ApprovedCount from RequisitionHistory rh
where rh.RequisitionCode =r.RequisitionCode order by rh.RequisitionDate desc),0)
-
ISNULL(
(select top 1 ApprovedCount from RequisitionHistory rh1 where rh1.RequisitionHistoryCode
NOT IN 
  (select top 1 RequisitionHistoryCode from RequisitionHistory rh2 
    where rh2.RequisitionCode =r.RequisitionCode order by rh2.RequisitionDate desc) 
  and rh1.RequisitionCode = r.RequisitionCode order by rh1.RequisitionDate DESC),0))
as StructureChange 
from Requisition r

在Sql Server中,您可以用更易读的方式执行此操作:

    WITH AprovalRecency AS (
    SELECT RequisitionCode, ApprovedCount, 
      RANK () OVER (PARTITION BY RequisitionCode 
                    ORDER BY RequisitionHistoryCode DESC) as Recency
    FROM RequisitionHistory 
    WHERE)
    SELECT r.*,  COALESCE(ar2.ApprovedCount, 0) - COALESCE(ar1.ApprovedCount, 0)
    FROM Requisition r LEFT JOIN 
     AprovalRecency ar1 ON r.RequisitionCode  = ar1.RequisitionCode 
                         AND ar1.Recency = 1 LEFT JOIN 
    AprovalRecency ar2 ON r.RequisitionCode  = ar2.RequisitionCode 
                         AND ar2.Recency = 2
.

您的“不在”应该使用RequisitionHistoryCode,因为这是历史记录表的主键。您的意思是“WHERE RequisitionHistoryCode NOT IN…”?我尝试过,但结果相同。
    WITH AprovalRecency AS (
    SELECT RequisitionCode, ApprovedCount, 
      RANK () OVER (PARTITION BY RequisitionCode 
                    ORDER BY RequisitionHistoryCode DESC) as Recency
    FROM RequisitionHistory 
    WHERE)
    SELECT r.*,  COALESCE(ar2.ApprovedCount, 0) - COALESCE(ar1.ApprovedCount, 0)
    FROM Requisition r LEFT JOIN 
     AprovalRecency ar1 ON r.RequisitionCode  = ar1.RequisitionCode 
                         AND ar1.Recency = 1 LEFT JOIN 
    AprovalRecency ar2 ON r.RequisitionCode  = ar2.RequisitionCode 
                         AND ar2.Recency = 2