Использование результата запроса во входных параметрах для общего табличного выражения - PullRequest
0 голосов
/ 16 ноября 2018

У меня такой запрос:

select distinct Project_Id,keyword,SE_Id from Table1 ;

Он возвращает мне почти 14.000 строк.

У меня есть другой SQL-запрос, который выглядит следующим образом:

with DateWithValue as (

SELECT * 
  FROM DateTable as dt LEFT JOIN Table1 as PK on dt.Date_ID=PK.Load_Date and PK.Project_Id=? and Pk.keyword=? and SE_Id=?
LEFT JOIN Table2 as pr on PK.Project_ID=pr.Project_ID
where PK.Domain is not null and 
dt.Date_ID>= (SELECT min(Load_Date) from Table1 where Project_Id=? and keyword=? and SE_Id=? ) and
dt.Date_ID<= (SELECT max(Load_Date) from Table1 where Project_Id=? and keyword=? and SE_Id=? )
--order by Date_ID
)
select * from DateTable as dt Left join DateWithValue on dt.Date_ID=DateWithValue.Date_ID 
where DateWithValue.Date_ID is not null
order by dt.Date_ID

В этом запросе ? должно быть заменено результатом первого запроса.

Как я могу объединить эти два запроса?у вас есть идея для меня

ОБНОВЛЕНИЕ: я изменил свой запрос следующим образом (для лучшего анализа, я держу пример):

    SELECT 
    dt.Date_ID
    ,Pk.keyword
--  ,pr.Company_BK
--  ,pr.Project_URL
    ,t2.pos_position
    ,pk.Project_Id
    ,PK.SE_Id
FROM 
    DimDate as dt 
    JOIN 
    (
    SELECT
    t1.Project_Id,
    t1.keyword,
    t1.SE_Id,
    Min_Load_Date =  MIN(t1.Load_Date),
    Max_Load_Date = MAX(t1.Load_Date)
FROM
    [RL].[SearchMetrics_ProjectKeyword] t1
    where keyword='aktueller gaspreis pro kwh' and Project_Id=383601 and SE_ID=1  
GROUP BY
    t1.Project_Id,
    t1.keyword,
    t1.SE_Id
    )
     as PK 
        ON dt.Date_ID >=  PK.Min_Load_Date
        AND dt.Date_ID <  PK.Max_Load_Date
        --AND PK.Project_Id=? 
        --AND Pk.keyword=? 
        --AND SE_Id=?
        LEFT JOIN [RL].[SearchMetrics_ProjectKeyword] t2
          on Pk.Project_Id=t2.Project_Id and PK.keyword=t2.keyword and PK.SE_Id=t2.SE_Id and t2.Load_Date >=  dt.Date_ID and t2.Load_Date <=  dt.Date_ID
--    LEFT JOIN MDM.SearchMetrics_Project as pr 
 --       ON PK.Project_ID=pr.Project_ID

с этим запросом я получаю такой результат:

enter image description here

Структура - это именно то, что я искал, но новая задача - это столбец pos_positin, который иногда имеет значения NULL.Но так не должно быть.Этот столбец между 20180406 и 20180412 должен быть 19, а между 20180413 и 20180423 - 21 Как я могу добиться этого с помощью этого запроса?

ОБНОВЛЕНИЕ 2: я получил вот решение, которое является:

with cte as
(
    SELECT 
    dt.Date_ID
    ,Pk.keyword
--  ,pr.Company_BK
--  ,pr.Project_URL
    ,t2.pos_position
    ,pk.Project_Id
    ,PK.SE_Id
FROM 
    DimDate as dt 
    JOIN 
    (
    SELECT
    t1.Project_Id,
    t1.keyword,
    t1.SE_Id,
    Min_Load_Date =  MIN(t1.Load_Date),
    Max_Load_Date = MAX(t1.Load_Date)
FROM
    [RL].[SearchMetrics_ProjectKeyword] t1
    where keyword='citire gaze' and Project_Id=1458724 and SE_ID=79
GROUP BY
    t1.Project_Id,
    t1.keyword,
    t1.SE_Id
    )
     as PK 
        ON dt.Date_ID >=  PK.Min_Load_Date
        AND dt.Date_ID <  PK.Max_Load_Date
        --AND PK.Project_Id=? 
        --AND Pk.keyword=? 
        --AND SE_Id=?
        LEFT JOIN [RL].[SearchMetrics_ProjectKeyword] t2
          on Pk.Project_Id=t2.Project_Id and PK.keyword=t2.keyword and PK.SE_Id=t2.SE_Id and t2.Load_Date >=  dt.Date_ID and t2.Load_Date <=  dt.Date_ID
--    LEFT JOIN MDM.SearchMetrics_Project as pr 
 --       ON PK.Project_ID=pr.Project_ID
    )
    select a.Date_ID
    ,a.keyword
    ,a.Project_Id
    ,a.SE_Id
    ,ISNULL(a.pos_position,x.pos_position) pos_position
     from cte a outer apply
(select top 1 pos_position 
    from cte b 
    where b.Date_ID<a.Date_ID and 
        b.Project_Id is not null and 
        b.pos_position is not null and 
        a.pos_position is null order by Date_ID desc)x

1 Ответ

0 голосов
/ 16 ноября 2018

Это должно дать вам то, что вы хотите, и пропустить кучу проблем с производительностью ...

Измените свой 1-й запрос на это ...

-- #first_query...
SELECT
    t1.Project_Id,
    t1.keyword,
    t1.SE_Id,
    Min_Load_Date = CONVERT(DATE, MIN(t1.Load_Date)),
    Max_Load_Date = CONVERT(DATE(MAX(t1.Load_Date))
FROM
    dbo.Table1 t1
GROUP BY
    t1.Project_Id,
    t1.keyword,
    t1.SE_Id;

Тогда вывторой запрос будет выглядеть так ...

SELECT 
    * 
FROM 
    dbo.DateTable as dt 
    JOIN #First_Query as PK 
        ON dt.Date_ID >=  PK.Min_Load_Date
        AND dt.Date_ID < DATEADD(DAY, 1, Max_Load_Date)
        --AND PK.Project_Id=? 
        --AND Pk.keyword=? 
        --AND SE_Id=?
    LEFT JOIN Table2 as pr 
        ON PK.Project_ID=pr.Project_ID;
--where 
--  PK.Domain is not null 
--  AND  dt.Date_ID>= (SELECT min(Load_Date) from Table1 where Project_Id=? and keyword=? and SE_Id=? ) 
--  AND dt.Date_ID<= (SELECT max(Load_Date) from Table1 where Project_Id=? and keyword=? and SE_Id=? )
--order by Date_ID
...