2016-07-25 3 views
1

У меня есть набор данных, который содержит аналогичные значения и количество дат. Я пытаюсь написать 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 находит разницу между датами для каждого идентификатора, и суммирует стоимость. Однако функция date_diff не работает для меня, и я думаю, что это может быть одна из первых проблем. Функция date_diff возвращает эту ошибку:

Функция dateiff (неизвестно, дата, временная метка без часового пояса) не существует Подсказка: никакая функция не соответствует указанному имени и типам аргументов. Возможно, вам придется добавлять явные типы.

Я использую общедоступный набор данных, так что это может быть частью проблемы. Любая помощь или идеи были бы замечательными!

+0

Что произойдет, если для id 1 будет 3 строки? – mayu

+0

Привет @Tymski В идеале, я бы нашел разницу в днях между минимальными и максимальными датами для данного ID. Для ID 1, если бы было три строки, date_diff будет разницей в битве самых ранних и последних дат, похожих на ID 2. Спасибо! – NLourme

+0

Какая СУБД вы используете? –

ответ

1

Давайте создадим тестовую таблицу:

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 строки с идентификатором. Код все равно будет работать, но если это будет иметь смысл с логической точки зрения для вашего приложения, я не знаю.

+0

Это хорошо работает, спасибо. Я думаю, что функция DateDiff не работала специально для данных, которые я использовал, потому что я использовал ваше решение на другом наборе данных, и он отлично работал. Я закончил работу только с отметкой времени (max (date) - min (date)). – NLourme

Смежные вопросы