Переписать Common Table Expression (CTE) в Subquery для создания совместимого PowerBI DirectQuery - PullRequest
0 голосов
/ 24 октября 2019

У меня следующий запрос MS SQL Server, который при запуске в PowerBI выдает ошибку, так как CTE не поддерживаются DirectQuery.

;WITH Daily_Report_CTE
AS
  (
    SELECT WazeUpdateTime_PST, Name, Length, Time, TimePeriod =
    (
      CASE
        WHEN DATEPART(hour, WazeUpdateTime_PST) >= 5 AND DATEPART(hour, WazeUpdateTime_PST) < 11 THEN 'Morning'
        WHEN DATEPART(hour, WazeUpdateTime_PST) >= 11 AND DATEPART(hour, WazeUpdateTime_PST) < 17 THEN 'Mid-Day'
        WHEN DATEPART(hour, WazeUpdateTime_PST) >= 17 AND DATEPART(hour, WazeUpdateTime_PST) < 23 THEN 'Evening'
        ELSE 'Overnight'
      END
     )
    FROM Repository_Archive.DataManagement_Ops_AllAccess.vw_Waze_TVT_ParsedJSON_Routes
    WHERE (DATEPART(dy, WazeUpdateTime_PST) BETWEEN DATEPART(dy,DateAdd(DD,-21,( GETDATE() AT TIME ZONE 'Pacific Standard Time'))) and DATEPART(dy,( GETDATE() AT TIME ZONE 'Pacific Standard Time')))
    AND (DATENAME(weekday, WazeUpdateTime_PST)) = DATENAME(weekday, ( GETDATE() AT TIME ZONE 'Pacific Standard Time'))
    AND Name IN ('I-105 to UL', 'La Cienega to UL', '405-La Tijera-Sepulveda to UL', 'Manchester to UL', 'Howard Hughes to UL', 'Lincoln to UL', 'Lincoln-Manchester to UL')
   )

SELECT WazeUpdateTime_PST, Name, Length, Time, TimePeriod, 
  Color = 
    (
     CASE
      WHEN Time > PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY Time)  
    OVER (PARTITION BY Name, TimePeriod)
          THEN 'Red'
      WHEN Time > PERCENTILE_CONT(0.6) WITHIN GROUP (ORDER BY Time)  
    OVER (PARTITION BY Name, TimePeriod)
          THEN 'Yellow'
      ELSE 'Green'
     END
     )
FROM Daily_Report_CTE

Обходным решением является переписывание CTE как подзапросов в основном запросе. Я не самый знающий, когда дело доходит до SQL Server или SQL в целом, и было сложно создать работающий запрос с использованием CTE.

Как мне переписать это как подзапрос?

1 Ответ

0 голосов
/ 24 октября 2019

В этом случае вы можете просто переместить CTE в ОТ

SELECT WazeUpdateTime_PST, Name, Length, Time, TimePeriod, 
  Color = 
    (
     CASE
      WHEN Time > PERCENTILE_CONT(0.95) WITHIN GROUP (ORDER BY Time)  
    OVER (PARTITION BY Name, TimePeriod)
          THEN 'Red'
      WHEN Time > PERCENTILE_CONT(0.6) WITHIN GROUP (ORDER BY Time)  
    OVER (PARTITION BY Name, TimePeriod)
          THEN 'Yellow'
      ELSE 'Green'
     END
     )
FROM (
        SELECT WazeUpdateTime_PST, Name, Length, Time, TimePeriod =
            (
              CASE
                WHEN DATEPART(hour, WazeUpdateTime_PST) >= 5 AND DATEPART(hour, WazeUpdateTime_PST) < 11 THEN 'Morning'
                WHEN DATEPART(hour, WazeUpdateTime_PST) >= 11 AND DATEPART(hour, WazeUpdateTime_PST) < 17 THEN 'Mid-Day'
                WHEN DATEPART(hour, WazeUpdateTime_PST) >= 17 AND DATEPART(hour, WazeUpdateTime_PST) < 23 THEN 'Evening'
                ELSE 'Overnight'
              END
             )
            FROM Repository_Archive.DataManagement_Ops_AllAccess.vw_Waze_TVT_ParsedJSON_Routes
            WHERE (DATEPART(dy, WazeUpdateTime_PST) BETWEEN DATEPART(dy,DateAdd(DD,-21,( GETDATE() AT TIME ZONE 'Pacific Standard Time'))) and DATEPART(dy,( GETDATE() AT TIME ZONE 'Pacific Standard Time')))
            AND (DATENAME(weekday, WazeUpdateTime_PST)) = DATENAME(weekday, ( GETDATE() AT TIME ZONE 'Pacific Standard Time'))
            AND Name IN ('I-105 to UL', 'La Cienega to UL', '405-La Tijera-Sepulveda to UL', 'Manchester to UL', 'Howard Hughes to UL', 'Lincoln to UL', 'Lincoln-Manchester to UL')
     ) A
...