2017-01-28 2 views
0

Ich versuche, die folgende Abfrage neu schreiben, da ich nicht so viele Fensterfunktionen verwenden möchte. Gibt es eine Möglichkeit, die folgende Logik neu zu schreiben? Bisher habe ich versucht, temporäre Tabellen zu erstellen und Jonins zu verwenden, aber das hat nicht viel geholfen.Abfrage überschreiben Logik

SELECT a.* 
FROM (
    SELECT F.DT_KEY AS DT_KEY 
     ,F.COL_KEY AS COL_KEY 
     ,F.PCK_ITM_KEY AS PCK_ITM_KEY 
     ,F.KEY3 AS KEY3 
     ,F.KEY4 AS KEY4 
     ,F.KEY1 AS KEY1 
     ,F.KEY2 AS KEY2 
     ,F.KEY3 AS KEY3 
     ,F.SH_QTY AS SH_QTY 
     ,SUM(F.SLS_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS SLS_QTY 
     ,SUM(F.SLS_RTRN_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS SLS_RTRN_QTY 
     ,SUM(F.PCHSE_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS PCHSE_QTY 
     ,SUM(F.ADJ_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS ADJ_QTY 
     ,SUM(F.SED_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS SED_QTY 
     ,SUM(F.RTV_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS RTV_QTY 
     ,SUM(F.PRN_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS PRN_QTY 
     ,SUM(F.ML_IN_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS ML_IN_QTY 
     ,SUM(F.ML_OUT_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS ML_OUT_QTY 
     ,SUM(F.BK_ML_IN_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS BK_ML_IN_QTY 
     ,SUM(F.BK_ML_OUT_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS BK_ML_OUT_QTY 
     ,SUM(F.INT_COMP_IN_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS INT_COMP_IN_QTY 
     ,SUM(F.INT_COMP_OUT_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS INT_COMP_OUT_QTY 
     ,SUM(F.ML_RCPT_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS ML_RCPT_QTY 
     ,SUM(F.RCPT_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS RCPT_QTY 
     ,SUM(F.STCK_ADJ_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS STCK_ADJ_QTY 
     ,SUM(F.WHSL_SLS_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS WHSL_SLS_QTY 
     ,SUM(F.WH_RTRN_QTY) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS WH_RTRN_QTY 
     ,SUM(F.NET_SLS_AMT) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS NET_SLS_AMT 
     ,SUM(F.NET_WH_SLS_AMT) OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ) AS NET_WH_SLS_AMT 
     ,F.IN_TRNST_QTY AS IN_TRNST_QTY 
     ,F.LST_RCVD_QTY AS LST_RCVD_QTY 
     ,F.LST_SLD_QTY AS LST_SLD_QTY 
     ,MIN(F.FRST_RCVD_DT) OVER (
      PARTITION BY F.KEY1 
      ,F.KEY3 
      ) AS FRST_RCVD_DT 
     ,MAX(F.LST_RCVD_DT) OVER (
      PARTITION BY F.KEY1 
      ,F.KEY3 
      ) AS LST_RCVD_DT 
     ,MAX(F.LST_LST_RCVD_DT) OVER (
      PARTITION BY F.KEY1 
      ,F.KEY3 
      ) AS LST_LST_RCVD_DT 
     ,MIN(F.FRST_SLD_DT) OVER (
      PARTITION BY F.KEY1 
      ,F.KEY3 
      ) AS FRST_SLD_DT 
     ,MAX(F.LST_SLD_DT) OVER (
      PARTITION BY F.KEY1 
      ,F.KEY3 
      ) AS LST_SLD_DT 
     ,MIN(F.FRST_ML_DT) OVER (
      PARTITION BY F.KEY1 
      ,F.KEY3 
      ) AS FRST_ML_DT 
     ,MAX(F.LST_ML_DT) OVER (
      PARTITION BY F.KEY1 
      ,F.KEY3 
      ) AS LST_ML_DT 
     ,F.LST_MODFD_DTTM AS LST_MODFD_DTTM 
     ,ROW_NUMBER() OVER (
      PARTITION BY F.KEY4 
      ,F.KEY1 
      ,F.KEY2 
      ,F.KEY3 
      ,F.COLE ORDER BY F.DT_KEY DESC 
      ) AS RNK 
    FROM FCT_ITEM_KEY F 
    ) a 
WHERE a.RNK = 1; 
+0

Funktioniert das ** du **? Sie sehen sich den Code von jemand anderem an und beginnen ihn zu ändern, ohne zu fragen "Wie sehen die Eingabedaten aus?", "Was ist die Anforderung" und "Wie sollte die Ausgabe aussehen?" Wenn ja, möchte ich nicht, dass Sie an meinem Code arbeiten. Wenn nicht (was sehr wahrscheinlich ist), warum erwarten Sie, dass wir so arbeiten? Bitte zeigen Sie, was die Eingaben sind, was die Anforderung ist und was die Ausgabe sein soll. Fordern Sie uns nicht auf, zu "erraten", indem Sie nur den Code lesen - so sollten solche Dinge nicht gemacht werden. – mathguy

+0

@mathguy Ich bin sehr neu in diesem Forum. Vielen Dank für Ihren Vorschlag. Ich werde Beispieldaten hinzufügen. – ciprian

+0

Hallo Ciprian, - Sie könnten dies nützlich finden (wenn Sie Zeit haben). http://StackOverflow.com/Help Und vor allem http://StackOverflow.com/Help/Mcve – mathguy

Antwort

0

Ich glaube, Sie bedingte Aggregation verwenden können, wenn Sie mögen:

SELECT F.KEY4, F.KEY1, F.KEY2, F.KEY3, F.COLE, 
     MAX(CASE WHEN seqnum = 1 THEN F.DT_KEY END) AS DT_KEY, 
     MAX(CASE WHEN seqnum = 1 THEN F.COL_KEY END) AS COL_KEY, 
     MAX(CASE WHEN seqnum = 1 THEN F.PCK_ITM_KEY END) AS PCK_ITM_KEY, 
     MAX(CASE WHEN seqnum = 1 THEN F.SH_QTY END) AS SH_QTY, 
     SUM(F.SLS_QTY) AS SLS_QTY, 
     . . . -- similar for all the sums 
     MIN(MIN(F.FRST_RCVD_DT)) OVER (PARTITION BY F.KEY1, F.KEY3) AS FRST_RCVD_DT, -- still need the window function because the keys are a subset of the `group by` keys, 
     . . . 
FROM (SELECT F.*, 
      ROW_NUMBER() OVER (PARTITION BY F.KEY4, F.KEY1, F.KEY2, F.KEY3, F.COLE 
           ORDER BY F.DT_KEY DESC 
          ) AS seqnum 
     FROM FCT_ITEM_KEY F 
    ) F 
GROUP BY F.KEY4, F.KEY1, F.KEY2, F.KEY3, F.COLE; 

Ich weiß nicht, ob die Leistung besser sein wird.

+0

Danke für diese Lösung und es wurde ausgeführt, außer 'MIN (MIN (F.FRST_RCVD_DT)) OVER (Partition von F.KEY1 , F.KEY3) AS FRST_RCVD_DT' und verwandte. Aufgrund dessen stieg die Ausführungszeit mehr als die ursprüngliche. Irgendeine Problemumgehung möglich? – ciprian

+0

@ciprian Wenn Sie ein Leistungsproblem haben, können Sie den SQL Monitor-Bericht freigeben – BobC

+0

Nach dem Erstellen von Indizes auf KEY1, KEY2, KEY3, KEY4 Leistung verbessert sich sehr. – ciprian