问题描述:
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. 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语句写出来,谢谢!
另外,就你给的例子而言,基本是不可能出现“过去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