Сравните последнюю и вторую последнюю запись для каждого контракта - PullRequest
2 голосов
/ 18 февраля 2011

Проще говоря, мой вопрос похож на ЭТОТ ВОПРОС, ЧАСТЬ 2 , единственная проблема в том, что я не использую Oracle и, следовательно, не могу использовать числа.

Для тех, кому нужна дополнительная информация и примеры:

У меня есть стол

  contractId date          value    
  1          09/02/2011     A         
  1          13/02/2011     C          
  2          02/02/2011     D   
  2          08/02/2011     A  
  2          12/02/2011     C  
  3          22/01/2011     C  
  3          30/01/2011     B  
  3          12/02/2011     D    
  3          21/01/2011     A

РЕДАКТИРОВАТЬ: добавил еще одну строку для ContractID. Так как у меня был некоторый код, но это отобразило бы следующее:

  contractId date          value    value_old
  1          09/02/2011     A                  
  2          08/02/2011     A         D
  3          30/01/2011     B         C    
  3          30/01/2011     B         A 

Но это не что я хочу! Результат должен быть таким, как показано ниже!

Теперь я хочу выбрать последнюю запись перед заданной датой и сравнить ее с предыдущим значением. Предположим, что в данном примере «заданной датой» является 11/02/2011 , результат должен быть таким:

  contractId date          value    value_old
  1          09/02/2011     A                  
  2          08/02/2011     A         D
  3          30/01/2011     B         C    

У меня есть запрос на выбор последней записи до указанной даты. Это легкая часть. Но чтобы выбрать последнюю запись перед , я потерялся ...

Я действительно надеюсь, что смогу получить некоторую помощь здесь, несколько дней ломал голову над этим и искал ответы в Интернете и через stackoverflow.

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

Одна возможность:

SELECT a.contractId, a.Date, a.Value, (SELECT Top 1 b.[Value] 
        FROM tbl b 
        WHERE b.[Date] < a.[Date] And b.ContractID=a.ContractID
        ORDER BY b.[Date] Desc) AS Old_Value
FROM tbl AS a
WHERE a.Date IN 
       (SELECT TOP 1 b.Date 
        FROM tbl b 
        WHERE b.ContractID=a.ContractID
        AND b.Date < #2011/02/11#
        ORDER BY b.date DESC)
0 голосов
/ 21 февраля 2011

Как и обещал, я бы также опубликовал свой ответ. Хотя в данный момент я все еще думаю, что ответ Рему лучше, так как код короче и кажется более эффективным (вызывает одну и ту же таблицу меньше раз). Но здесь идет:

Query1:

SELECT c.contractID, c.firstofdates, a.value, d.value, d.date
FROM (table1 AS A RIGHT JOIN (SELECT b.cid,max(b.date) AS FirstOfdates
FROM table1 as B
where b.date < #02/11/2011#
GROUP BY b.contractID    )  AS c ON (a.date = c.firstofdates) AND (a.contractID =   c.contractID)) 
LEFT JOIN (select e.contractID, e.date, e.value
from table1 as e
)  AS d ON (d.date < c.firstofdates) AND (d.contractID = c.contractID);

Этот запрос фактически дает результат с дополнительной строкой для 3-го contractID.

Query2:

SELECT b.contractID, max(a.date) AS olddate
FROM table1 AS a RIGHT JOIN (select contractID, firstofdates 
from Query1)  AS b ON (a.contractID= b.contractID) AND (a.date < b.firstofdates)
GROUP BY b.contractID;

А затем объединить оба:

Query3:

SELECT Query1.contractID, Query1.firstofdates AS [date], Query1.A.value AS [value], Query1.d.value  AS [old value]
FROM Query1 RIGHT JOIN Query2 
ON (Query1.date=Query2.olddate or Query2.olddate is null) AND   (Query1.cid = Query2.cid);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...