sql - 比较每个合约的最后记录和倒数第二个记录

标签 sql ms-access

为了简单起见,我的问题类似于 THIS QUESTION, PART 2 ,唯一的问题是,我没有运行 Oracle,因此无法使用行号。

对于那些需要更多信息和示例的人:

我有一张 table

  contractId date          value    
  1          09/02/2011     A         
  1          13/02/2011     C          
  2          02/02/2011     D   
  2          08/02/2011     A  
  2          12/02/2011     C  
  3          22/01/2011     C  
  3          30/01/2011     B  
  3          12/02/2011     D    
  3          21/01/2011     A

编辑:为 ContractID 添加了另一行。因为我自己有一些代码,但是会显示以下内容:

  contractId date          value    value_old
  1          09/02/2011     A                  
  2          08/02/2011     A         D
  3          30/01/2011     B         C    
  3          30/01/2011     B         A 

但这不是我想要的!结果应该仍然如下!

现在我想选择给定日期之前的最后一条记录并将其与之前的值进行比较。 假设本例中的“给定日期”是 11/02/2011,输出应如下所示:

  contractId date          value    value_old
  1          09/02/2011     A                  
  2          08/02/2011     A         D
  3          30/01/2011     B         C    

我确实有一个查询来选择给定日期之前的最后一条记录。这是最简单的部分。但是要选择之前的最后一条记录,我迷失了......

我真的希望我能在这里得到一些帮助,我已经为此绞尽脑汁好几天了,并在网络和 stackoverflow 上寻找答案。

最佳答案

一种可能性:

SELECT a.contractId, a.Date, a.Value, (SELECT Top 1 b.[Value] 
        FROM tbl b 
        WHERE b.[Date] < a.[Date] And b.ContractID=a.ContractID
        ORDER BY b.[Date] Desc) AS Old_Value
FROM tbl AS a
WHERE a.Date IN 
       (SELECT TOP 1 b.Date 
        FROM tbl b 
        WHERE b.ContractID=a.ContractID
        AND b.Date < #2011/02/11#
        ORDER BY b.date DESC)

关于sql - 比较每个合约的最后记录和倒数第二个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5040818/

相关文章:

mysql - 有两个表时限制如何工作?

sql - 在 SQL 中使用两个表进行透视和逆透视(将值转置为列标题)

ms-access - MS Access 查询中是否有 "Not In"的有效替代方案?

sql - Ms-Access 中的 IIF 语句

html - 如何在 MS-Access 的窗体上显示 Web 浏览器控件中的表字段内容?

mysql - 如何执行这个查询

java - JPA/Hibernate 选择查询返回重复记录

java - 在 MySQL 数据库中插入行之前从字符串中删除二进制代码

database - 存储由行源查询生成的列表框值

ms-access - 在 VBA/Access 中,更改记录时从当前记录获取值