2015-07-20 3 views
3

Использование SQL Мне нужно возвращать ровный набор результатов (то есть один в день) из набора данных, который содержит 0-N записей в день.Сглаживание результатов по дате

Результат в день должен быть самым последним предыдущим значением, даже если это не тот день. Например:

Начиная данные:

Date:  Time:  Value 
19/3/2014 10:01  5 
19/3/2014 11:08  3 
19/3/2014 17:19  6 
20/3/2014 09:11  4 
22/3/2014 14:01  5 

Требуемая мощность:

Date:  Value 
19/3/2014 6 
20/3/2014 4 
21/3/2014 4 
22/3/2014 5 
+0

Что вы написали до сих пор и как оно несовершенно? –

+0

Решение, скорее всего, будет зависеть от конкретной базы данных, которую вы используете, поэтому вы должны добавить тег для этого вопроса. – jpw

+0

База данных - это SQL Server. –

ответ

-1

Может быть, это работает, но попробуйте и дайте мне знать

select date, value from test where (time,date) in (select max(time),date from test group by date); 
0

Сначала вам нужно, чтобы завершить и укажите отсутствующие даты (21/3/2014 в вашем примере). Это может быть сделано путем объединения таблицы календаря, если она есть, или путем использования рекурсивного общего выражения таблицы для генерации полной последовательности «на лету».

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

with cte as (
    select min(date) date, max(date) max_date from your_table 
    union all 
    select dateadd(day, 1, date) date, max_date 
    from cte 
    where date < max_date 
) 

select 
    c.date, 
    (
    select top 1 max(value) from your_table 
    where date <= c.date group by date order by date desc 
    ) value 
from cte c 
order by c.date; 
Смежные вопросы