2015-08-11 3 views
1

Я работаю в Teradata SQL Assistant 14.10 и впадающих проблем со следующей проблемой:Teradata Window/Роллинг Сумма при их множественном

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

  • а) строка, для которой сумма истекшего времени превышает 20 мин, впервые
  • б) строка, для которой сумма истекшего времени превышает 15 мин каждый раз, после чего

Сложность состоит в том, что сумма, которая будет использоваться для установки флага, должна быть равна 0 после выполнения каждого условия. См. Приведенный ниже набор результатов, когда FLAG является желаемым выходным столбцом на основе вышеуказанных условий, и столбец причины, объясняющий, почему он должен быть помечен.

RN REPORT_DT SEG_CD NUM_F T1   T2   ELAPSED_TIME FLAG REASON 
1 6/22/2015 STATION 881  18:33:00 17:30:00 63    1  63 >= 20 min for first time 
2 6/22/2015 STATION 881  18:45:00 18:33:00 12    0  12 < 15 
3 6/22/2015 STATION 881  19:00:00 18:45:00 15    1  12 + 15 >= 15 
4 6/22/2015 STATION 881  19:15:00 19:00:00 15    1  15 >= 15 
5 6/22/2015 STATION 881  19:30:00 19:15:00 15    1  15 >= 15 
6 6/22/2015 STATION 881  19:40:00 19:30:00 10    0  10 < 15 
7 6/22/2015 STATION 881  19:50:00 19:40:00 10    1  10 + 10 >= 15 
8 6/22/2015 STATION 881  20:00:00 19:50:00 10    0  10 < 15 
9 6/22/2015 STATION 881  20:10:00 20:00:00 10    1  10 + 10 >= 15 

Я пробовал различные SUM() OVER (PARTITION BY ORDER BY СБРОС ПРИ) вид запросов, которые я чувствую, это правильное направление, но не могу показаться, чтобы получить какие-либо желаемых результатов.

Любые советы очень ценятся! Заранее спасибо!

+0

Увы, вы не может легко выполнить этот расчет с аналитическими функциями. Проблема в том, что у вас есть остаток (например, 3 в 3-й строке). Вы игнорируете это дополнительное превышение, что означает, что последующие строки должны точно знать, где были все предыдущие точки останова. –

+0

Вау - спасибо за быстрый ответ. Оцените, чтобы знать, что это невозможно, по крайней мере, спасает меня от того, что я весь день ломаю голову. – apd2zn

+0

Каково количество строк и максимальное количество строк на PARTITION? – dnoeth

ответ

3

Единственный способ, который я когда-либо нашел, чтобы вернуть такой результат, использует рекурсию.

вы получите максимальную скорость, если вы материализовать данные в виде летучего таблицы MultiSet с колоннами перегородки (REPORT_DT, SEG_CD, NUM_F) как первичный индекс первого, а затем начать рекурсии:

WITH RECURSIVE cte AS 
( 
SELECT 
    RN, 
    REPORT_DT, 
    SEG_CD, 
    NUM_F, 
    T1, 
    T2, 
    ELAPSED_TIME, 
    CASE WHEN ELAPSED_TIME >= 20 
     THEN 0 
     ELSE ELAPSED_TIME 
    END AS sum_ELAPSED_TIME, 
    CASE WHEN sum_ELAPSED_TIME = 0 
     THEN 1 
     ELSE 0 
    END AS FLAG 
FROM vt 
WHERE rn = 1 

UNION ALL 

SELECT 
    vt.RN, 
    vt.REPORT_DT, 
    vt.SEG_CD, 
    vt.NUM_F, 
    vt.T1, 
    vt.T2, 
    vt.ELAPSED_TIME, 
    CASE WHEN cte.sum_ELAPSED_TIME + vt.ELAPSED_TIME >= 15 
     THEN 0 
     ELSE cte.sum_ELAPSED_TIME + vt.ELAPSED_TIME 
    END AS new_ELAPSED_TIME, 
    CASE WHEN new_ELAPSED_TIME = 0 
     THEN 1 
     ELSE 0 
    END AS FLAG 
FROM vt 
JOIN cte 
    ON vt.REPORT_DT = cte.REPORT_DT 
AND vt.SEG_CD = cte.SEG_CD 
AND vt.NUM_F = cte.NUM_F 
AND vt.rn = cte.rn + 1 
) 
SELECT * FROM cte 
+0

Это потрясающе - Спасибо! – apd2zn

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