请考虑下表:
Person | 1/1/13 | 1/2/13 | 1/3/13 | 1/4/13 | 1/5/13
Bill | 4 | 2 | 1 | .5 | .25
Jane | 0 | 0 | 2 | 1 | .5
Mary | 0 | 8 | 4 | 2 | 1
-------------------------------------------------
Total | 4 | 10 | 7 | 3.5 | 1.75
这来自下表:
Bill | 1/1/13 | 4
Jane | 1/3/13 | 2
Mary | 1/2/13 | 8
基本上,我们知道第一天,然后我们假设每隔一天减少一半的价值.我想从第一个表中获取“总”行.
有没有办法在(T-)SQL中执行此操作?我已经在R中创建了它,但我完全不知道如何在SQL中实现它. (日期是实际日期,而不仅仅是星期几.)
最佳答案 如果你的表看起来像这样:
CREATE TABLE t (person VARCHAR(7), day_of_week_name VARCHAR(7), value NUMERIC);
INSERT INTO t VALUES ('Bill', 'Monday', 4);
INSERT INTO t values ('Jane', 'Weds', 2);
INSERT INTO t VALUES ('Mary', 'Tuesday', 8);
你有一些day_of_week表与天的相对位置:
CREATE TABLE day_of_week (name VARCHAR(7), position INT);
INSERT INTO day_of_week VALUES ('Monday', 1);
INSERT INTO day_of_week values ('Tuesday', 2);
INSERT INTO day_of_week VALUES ('Weds', 3);
INSERT INTO day_of_week VALUES ('Thurs', 4);
INSERT INTO day_of_week VALUES ('Friday', 5);
然后用PIVOT做这个并不太难看:
SELECT Monday, Tuesday, Weds, Thurs, Friday
FROM ( SELECT dow2.name AS day_of_week_name,
t.value / power(2, dow2.position - dow1.position) AS decayed_value
FROM t
JOIN day_of_week AS dow1
ON t.day_of_week_name = dow1.name
JOIN day_of_week AS dow2
ON dow1.position <= dow2.position
) AS b
PIVOT ( SUM(decayed_value)
FOR day_of_week_name
IN (Monday, Tuesday, Weds, Thurs, Friday)
) AS pvt
;