2015-11-17 3 views
-3

Я пытаюсь добавить значения между двумя строками порядка по дате. В частности строка определяется имеющими одинаковый идентификатор и типа «АСК»SQL-код для добавления между Asks

мне нужно:

  • добавить АМТ значения, где Type = Подарок между двумя Спрашивает по ID #, упорядоченное по дате
  • или пока не будет больше запросов.

Вот данные в таблице:

ID Date Type Amt 
1 1/1/15 Ask  100 
2 2/1/15 Ask  200 
1 3/1/15 Gift 25 
1 4/1/15 Gift 100 
2 5/1/15 Gift 50 
1 6/1/15 Ask  300 
1 7/1/15 Gift 100 
2 8/1/15 Gift 100 
2 9/1/15 Ask  200 

EDIT:

порядок данных по идентификатору, Дата

| ID |  Date | Type | Amt | 
|----|------------|------|-----| 
| 1 | 2015-01-01 | Ask | 100 | 
| 1 | 2015-03-01 | Gift | 25 | 
| 1 | 2015-04-01 | Gift | 100 | 
| 1 | 2015-06-01 | Ask | 300 | 
| 1 | 2015-07-01 | Gift | 100 | 
| 2 | 2015-02-01 | Ask | 200 | 
| 2 | 2015-05-01 | Gift | 50 | 
| 2 | 2015-08-01 | Gift | 100 | 
| 2 | 2015-09-01 | Ask | 200 | 

мне нужны результаты, чтобы выглядеть следующим образом:

ID Ask Amt Gift Amt 
1 100  125 
2 200  150 
1 300  100 
2 200 

Результат показывает, что каждый запрос по ID получает общее количество подарков до следующего запроса ID.

+0

Почему ' ID' не уникален? Что он представляет? – Dai

+1

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

+0

@Dai Похоже, (ID, Дата) является составным ключом. В любом случае дизайн «EAV» – lad2025

ответ

2

Позволяет сделать это шаг за шагом.

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

SELECT ASK.ID, ASK.Date, ASK.Amt as "Ask Amt" 
FROM yourtable as ASK 
WHERE Type = 'Ask' 
ORDER BY Date 

Я включенная дата, потому что нам это нужно позже.

Теперь у нас есть первые две колонки, что является третьим столбцом? Это сумма подарочных сумм в ассортименте.

Нам нужен диапазон дат, чтобы найти их. Для этого мы можем использовать функцию окна LEAD() (в SQL Server, DB2 и Oracle). Помните, что мы просто смотрим на тип «ASK» в этом запросе, поэтому следующий (ведущий) - это конец нашего диапазона.

SELECT ASK.ID, ASK.Date as S_Date, 
     LEAD(ASK.Date) OVER (Partition By ID ORDER BY Date) AS E_Date, ASK.Amt as "Ask Amt" 
FROM yourtable as ASK 
WHERE Type = 'Ask' 
ORDER BY Date 

Наконец мы возьмем этот запрос и присоединиться к нему обратно к столу и сделать группу, и суммы, чтобы получить наши результаты

SELECT sub.ID, sub.Ask_Amt, SUM(G.Amt) AS Give_Amt 
FROM (
    SELECT ASK.ID, ASK.Date as S_Date, 
      LEAD(ASK.Date) OVER (Partition By ID ORDER BY Date) AS E_Date, ASK.Amt as Ask_Amt 
    FROM yourtable as ASK 
    WHERE Type = 'Ask' 
) sub 
LEFT JOIN yourtable as G ON G.Type = 'Gift' 
        AND G.Date >= sub.S_Date 
        AND G.Date <= COALESCE (sub.E_Date,G.Date) 
        AND sub.ID = G.ID 
GROUP BY sub.ID, sub.Ask_Amt, sub.S_Date 

Рабочая скрипку ->http://sqlfiddle.com/#!3/5a87e/12

+1

Очень близко http://sqlfiddle.com/#!3/5a87e/5 Но не показывает последнее происшествие –

+0

@JuanCarlosOropeza - исправлено – Hogan

+1

Печально, что это тот факт, что несколько СУБД не выполняют функции Windows (например, MS SQL 2008). Это означает, что функция LEAD не будет использоваться. И мы до сих пор не знаем СУБД. –

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

  • Нет связанных вопросов^_^