问题描述:
1. Sql server版本:Sql Server 2008 R2 
2.假如有一个表:
Date Amount
2017/1/1 205.00
2017/1/2 208.00
2017/1/3 182.00
2017/1/4 193.00
2017/1/5 226.00
2017/1/6 218.00
2017/1/7 185.00
2017/1/8 205.00
2017/1/9 250.00
2017/1/10 300.00
2017/1/11 258.27
2017/1/12 265.73
2017/1/13 273.20
2017/1/14 280.67
2017/1/15 288.13
2017/1/16 295.60
2017/1/17 303.07
2017/1/18 310.53
2017/1/19 318.00
2017/1/20 325.47
这里的日期有可能不是连续的,例如某天放假就没数据。需要实现的效果:
1. 如果过去3天的平均值低于过去10天的平均值20%,则在Amount后面增加一列,列名叫Mark,写上“过去3天平均值低于过去10天平均值的20%”
2.这里的过去3天包含当天,但过去10天则不包含当天。
3.如果当前日期前面的数据小于或等于3天,则不需要比较,例如上表的:2017-1-4之前的则不需要比较,而2017-1-4及之后的每天都需要比较。
4.如果当前日期之前的天数不足10天,则以实际天数为准。例如2017-1-4~2017-1-9请问如何通过一条sql语句写出来,谢谢!

解决方案 »

  1.   

    因为你说日期可能不是连续的,那么你说的10天是指连续的十天还是10条记录?
    另外,就你给的例子而言,基本是不可能出现“过去3天平均值低于过去10天平均值的20%”这种情况的,是不是条件搞错了?
    做了个连续10条记录的
    IF NOT OBJECT_ID(N'Tempdb..#T') IS NULL
        DROP TABLE #T
    GO
    CREATE TABLE #T
    (
    id         INT IDENTITY(1, 1) PRIMARY KEY,
    date1      DATETIME,
    Amount     NUMERIC(18, 2)
    )
    INSERT #T
    SELECT '2017/1/1',
           205.00 UNION ALL
    SELECT '2017/1/2',
           208.00 UNION ALL
    SELECT '2017/1/3',
           182.00 UNION ALL
    SELECT '2017/1/4',
           193.00 UNION ALL
    SELECT '2017/1/5',
           226.00 UNION ALL
    SELECT '2017/1/6',
           218.00 UNION ALL
    SELECT '2017/1/7',
           185.00 UNION ALL
    SELECT '2017/1/8',
           205.00 UNION ALL
    SELECT '2017/1/9',
           250.00 UNION ALL
    SELECT '2017/1/10',
           300.00 UNION ALL
    SELECT '2017/1/11',
           258.27 UNION ALL
    SELECT '2017/1/12',
           265.73 UNION ALL
    SELECT '2017/1/13',
           273.20 UNION ALL
    SELECT '2017/1/14',
           280.67 UNION ALL
    SELECT '2017/1/15',
           288.13 UNION ALL
    SELECT '2017/1/16',
           295.60 UNION ALL
    SELECT '2017/1/17',
           303.07 UNION ALL
    SELECT '2017/1/18',
           310.53 UNION ALL
    SELECT '2017/1/19',
           318.00 UNION ALL
    SELECT '2017/1/20',
           325.47
    GO
    SELECT t1.*,
           CASE 
                WHEN t1.id < 3 THEN ''
                WHEN t3.day3amount < t3.day10amount * 0.2 THEN '过去3天平均值低于过去10天平均值的20%'
                ELSE ''
           END     AS MARK
    FROM   #T      AS t1
           JOIN (
                    SELECT *,
                           (
                               SELECT AVG(a.Amount)
                               FROM   (
                                          SELECT TOP 3 t2.Amount
                                          FROM   #T AS t2
                                          WHERE  t2.date1 <= t.date1
                                      ) a
                           )   AS day3amount,
                           (
                               SELECT AVG(b.Amount)
                               FROM   (
                                          SELECT TOP 10 t2.Amount
                                          FROM   #T AS t2
                                          WHERE  t2.date1 <= t.date1
                                      ) b
                           )   AS day10amount
                    FROM   #T  AS t
                )  AS t3
                ON  t1.id = t3.id