sql - 如何获取SQL表中的下一条记录

标签 sql sql-server sql-server-2005

我的 MS SQL 表中有一组记录。以日期为主键。但日期仅适用于工作日,而不适用于连续日。例如:

2000年1月3日上午12:00:00 5209.540000000 5384.660000000 5209.540000000 5375.110000000 2000 年 1 月 4 日 12:00:00 上午 5533.980000000 5533.980000000 5376.430000000 5491.010000000 2000 年 1 月 5 日 12:00:00 上午 5265.090000000 5464.350000000 5184.480000000 5357.000000000 2000 年 1 月 6 日 12:00:00 上午 5424.210000000 5489.860000000 5391.330000000 5421.530000000 2000 年 1 月 7 日 12:00:00 上午 5358.280000000 5463.250000000 5330.580000000 5414.480000000 2000 年 1 月 10 日 12:00:00 上午 5617.590000000 5668.280000000 5459.970000000 5518.390000000 2000 年 1 月 11 日 12:00:00 上午 5513.040000000 5537.690000000 5221.280000000 5296.300000000 2000年1月12日 12:00:00 上午 5267.850000000 5494.300000000 5267.850000000 5491.200000000

在此,我试图在表中引入一个新列,其值应该是第三列的值减去前一个工作日的第三列的值。请帮助我写这样的查询。我发现这很困难,因为周末没有日期。

最佳答案

有几种方法可以做到这一点。这是一个。

CREATE TABLE MyTable
(
    MyDate datetime NOT NULL PRIMARY KEY,
    Col2 decimal(14,4) NOT NULL,
    Col3 decimal(14,4) NOT NULL,
    Col4 decimal(14,4) NOT NULL,
    Col5 decimal(14,4) NOT NULL
)
GO

INSERT INTO MyTable
SELECT '1/3/2000 12:00:00 AM', 5209.540000000, 5384.660000000, 5209.540000000, 5375.110000000 
 UNION ALL 
SELECT '1/4/2000 12:00:00 AM', 5533.980000000, 5533.980000000, 5376.430000000, 5491.010000000
 UNION ALL 
SELECT '1/5/2000 12:00:00 AM', 5265.090000000, 5464.350000000, 5184.480000000, 5357.000000000
 UNION ALL 
SELECT '1/6/2000 12:00:00 AM', 5424.210000000, 5489.860000000, 5391.330000000, 5421.530000000 
 UNION ALL 
SELECT '1/7/2000 12:00:00 AM', 5358.280000000, 5463.250000000, 5330.580000000, 5414.480000000 
 UNION ALL 
SELECT '1/10/2000 12:00:00 AM', 5617.590000000, 5668.280000000, 5459.970000000, 5518.390000000 
 UNION ALL 
SELECT '1/11/2000 12:00:00 AM', 5513.040000000, 5537.690000000, 5221.280000000, 5296.300000000 
 UNION ALL 
SELECT '1/12/2000 12:00:00 AM', 5267.850000000, 5494.300000000, 5267.850000000, 5491.200000000
GO

CREATE VIEW MyView 
AS
SELECT T1.*,
    CalculatedColumn = Col3 - 
      (SELECT Col3 FROM MyTable Q2
       WHERE Q2.MyDate = (SELECT MAX(Q1.MyDate) 
                          FROM MyTable Q1 
                          WHERE Q1.MyDate < T1.MyDate)
    )
FROM MyTable T1
GO

SELECT * FROM MyView
GO

结果

MyDate                  Col2      Col3      Col4      Col5      CalculatedColumn
----------------------- --------- --------- --------- --------- ----------------
2000-01-03 00:00:00.000 5209.5400 5384.6600 5209.5400 5375.1100 NULL
2000-01-04 00:00:00.000 5533.9800 5533.9800 5376.4300 5491.0100 149.3200
2000-01-05 00:00:00.000 5265.0900 5464.3500 5184.4800 5357.0000 -69.6300
2000-01-06 00:00:00.000 5424.2100 5489.8600 5391.3300 5421.5300 25.5100
2000-01-07 00:00:00.000 5358.2800 5463.2500 5330.5800 5414.4800 -26.6100
2000-01-10 00:00:00.000 5617.5900 5668.2800 5459.9700 5518.3900 205.0300
2000-01-11 00:00:00.000 5513.0400 5537.6900 5221.2800 5296.3000 -130.5900
2000-01-12 00:00:00.000 5267.8500 5494.3000 5267.8500 5491.2000 -43.3900

关于sql - 如何获取SQL表中的下一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/505780/

相关文章:

c# - SQL 添加数据的权限以及如何验证?

SQL 触发器无法正常工作

mysql - LEFT Join SQL 需要超过 5 分钟并崩溃

MySQL SELECT 基于多列聚合

mysql - 试图获得申请了年龄范围工作的男性/女性的百分比

c# - Linq to SQL - 无法更新

SQL Server : most commonly used data types?

sql-server - sql : select rows based on another table if is populated or empty

mysql - 如何同步2个数据库中的产品库存。 Mysql和MSSQL实时

mysql - lat long 范围内的 SQL lat longs