查找具有相同值的行之间的日期差异
问题描述:
我有一个包含相似值和日期数的数据集。我正在尝试编写一个sql查询来查找行之间日期的差异,并将另一行中的值相加。该数据集是这样的:查找具有相同值的行之间的日期差异
id | date | value |
1 2015-06-01 10
1 2015-09-22 25
2 2015-12-10 15
2 2015-07-11 20
2 2015-10-18 25
3 2015-04-05 30
3 2015-05-02 45
4 2015-06-01 20
而我想获得的是:
id | date_diff | value
1 42 35
2 149 60
3 27 75
4 0 20
的想法是date_diff发现日期为每个ID之间的区别,并总结了值。但是,date_diff函数不适合我,我认为这可能是第一个问题。 date_diff函数返回此错误:
函数datediff(未知,日期,时间戳无时区)不存在 提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
我正在使用公共数据集,因此可能是问题的一部分。任何帮助或想法都会很棒!
答
让我们创建一个测试表:
create table test
(
id int ,
date DATE,
value int
)
insert into test values (1, CAST('2015-06-01' AS DATE), 10);
insert into test values (1, CAST('2015-09-22' AS DATE), 25);
insert into test values (2, CAST('2015-12-10' AS DATE), 100);
insert into test values (2, CAST('2015-07-11' AS DATE), 200);
让我们来看看这些数据:
select * from test ORDER BY id;
1 2015-06-01 10
1 2015-09-22 25
2 2015-12-10 100
2 2015-07-11 200
让我们做的魔术。
select datediff(day, MIN(DATE), MAX(DATE)) as diff_in_days, sum(value) as sum_of_values FROM test group by id;
113 35
152 300
请注意,您没有指定当有3行id时应该发生什么。代码仍然可以工作,但是如果从您的应用程序的逻辑角度来看它是有意义的,我不知道。
+0
工作得很好,谢谢。我认为DateDiff函数不适用于我正在使用的数据,因为我在不同的数据集上使用了您的解决方案,并且它运行得非常好。我结束了与时间戳(最大(日期) - 分钟(日期))。 – NLourme
如果id为1的行有3行,会发生什么情况? – mayu
Hi @Tymski理想情况下,我会发现给定ID的最短和最长日期之间的差异。对于ID 1,如果有三行,则date_diff将是最早和最近日期的差异btw,类似于ID 2.谢谢! – NLourme
您正在使用哪些DBMS? –