2013-06-28 3 views
-2

У меня есть таблица с политикой нет, код состояния, дата состояния.Запрос, чтобы вернуть разницу дат между записями

Я хочу получить разницу между датами статуса для каждой политики (будет иметь более одной записи с разными кодами состояния) после сортировки по датам состояния для каждой политики.

Разница в датах состояния должна учитывать только определенные коды состояния. для, например: считают, что 5,6 являются коды состояния, которые необходимо учитывать

pol_nm st_cd st_date 
pol 1 5  1st june 
pol 1 6  2nd june 
pol 1 7  4th june 
pol 1 6  6th june 
pol 1 8  9th june 
pol 1 9 10th june 
pol 1 10 11th june 

я должен получить выход как

pol_nm sleep_tm 
pol 1  6 

, которая является разница (4 июня по 1 июня) + (девятую июнь-6 июня)

Может ли кто-нибудь помочь мне запросить выход?

Некоторые примеры, основанные на новом Req:

Policy_No Status_Cd  Status_Dt  
A    8  02/01/2011  
A    23  03/30/2011 

Policy_Sleep_Time 0 
--------------------------------------------------------- 

Policy_No Status_Cd Status_Dt  
B    8  12/29/2011  
B    27   01/28/2012   
B    27   01/28/2012  124 
B    34   05/31/2012  

Policy_Sleep_Time 124 
--------------------------------------------------------- 
Policy_No Status_Cd Status_Dt  
C    4  02/11/2007  
C    4  02/11/2007 

Policy_Sleep_Time 0 
--------------------------------------------------------- 
Policy_No Status Cd  Status_Dt 
D    8  9/17/2012 
D    8  9/17/2012 
D    8  9/17/2012 
D    23  1/1/2013 
D    3  2/1/2013 
D    5  2/5/2012 
D    23  3/1/2013 
D    8  3/6/2013 
D    8  3/6/2013 
D    44  3/9/2013 
D    1  3/23/2013 

Here the policy sleep time is 35 
+0

Можете ли вы приложить больше усилий при написании своего вопроса? Как имена столбцов в таблице и каковы ваши выходные столбцы? –

+0

имена столбцов - нет политики, код состояния, дата состояния. – RRR

+0

Добавление еще одного столбца для времени ожидания. Мне нужно проверить правильность времени ожидания. – RRR

ответ

3

Вы до сих пор не определили фактические правила, поэтому этот курсор-логика является только предположение:

Сортировать по pol_nm и st_date, а затем повторить для каждого pol_nm:

  1. найти строку с st_cd 5 или 6, и помните, что st_date
  2. найти следующую строку с st_cd <> 5/6 и вычислить разницу между двумя st_dates
  3. повторе 1 и 2, пока вы не достигнете следующего pol_nm
  4. сумма разницы

Это приводит к следующему SQL

SELECT pol_nm, SUM(days) 
FROM 
(
    SELECT pol_nm, next_date-MIN(ST_DATE) AS days 
    FROM 
    (
     SELECT pol_nm, ST_CD, ST_DATE, 
     MIN(CASE WHEN ST_CD NOT IN (5,6) THEN ST_DATE END) 
     OVER (PARTITION BY pol_nm 
       ORDER BY ST_DATE 
       ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) AS next_date 
     FROM tab 
     QUALIFY ST_DATE <> next_date 
    ) AS dt 
    GROUP BY pol_nm, next_date 
) AS dt 
GROUP BY pol_nm 

Dieter

+1

Добро пожаловать в Stack Overflow, Dieter! Я очень рад видеть вас здесь! – BellevueBob

+0

Добро пожаловать Дитер! –

+0

Привет, Дитер, у меня есть некоторые изменения в требовании. – RRR