Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写带有多个CTE子查询SQL/R的单个查询_Sql_R_Sql Server_Database - Fatal编程技术网

编写带有多个CTE子查询SQL/R的单个查询

编写带有多个CTE子查询SQL/R的单个查询,sql,r,sql-server,database,Sql,R,Sql Server,Database,我想从数据库中提取一些数据,我正在使用RStudio进行查询。我想写的是: 第一个CTE声明获取我所有必要的信息 第二个CTE语句将为两个行号添加两个新列,这两个行号由不同的组划分。将为超前和滞后值添加两个附加列 第三个CTE将生成另外两列,其中两列使用嵌套的case_when语句来提供NewOpen和NewClosed日期 到目前为止,我所拥有的: q5<- sqlQuery(ch,paste(" ;with CTE AS ( select oz.id as Acco

我想从数据库中提取一些数据,我正在使用RStudio进行查询。我想写的是:

  • 第一个CTE声明获取我所有必要的信息

  • 第二个CTE语句将为两个行号添加两个新列,这两个行号由不同的组划分。将为超前和滞后值添加两个附加列

  • 第三个CTE将生成另外两列,其中两列使用嵌套的case_when语句来提供NewOpen和NewClosed日期

  • 到目前为止,我所拥有的:

    q5<- sqlQuery(ch,paste(" 
    ;with CTE AS
    (
        select 
        oz.id as AccountID
        ,ac.PROD_TYPE_CDE as ProductTypeCode
        ,CASE WHEN ac.OPEN_DTE='0001-01-01' then null else ac.OPEN_DTE END as OpenDate
        ,CASE WHEN ac.CLOS_DTE = '0001-01-01' then null else ac.CLOS_DTE END as ClosedDate
        ,df.proc_dte as FullDate
    
       FROM
       dbs.tb_dbs_acct_fact df
       inner join
       dbs.tb_acct_details ac on df.dw_serv_id = ac.dw_serv_id
       left outer join
       dbs.tb_oz_id oz on df.proc_dte = oz.proc_dte 
    ),
    
    cte1 as 
    (
       select *
      ,row_nbr = row_number() over( partition by AccountID order by AccountID, FullDate asc )
      ,row_nbr2 = row_number() over( partition by AccountID,ProductTypeCode order by AccountID, FullDate asc )
      ,lag(ProductTypeCode) over(partition by AccountID order by FullDate asc ) as Lagging
      ,LEAD(ProductTypeCode) over(partition by AccountID order order by FullDate asc  ) as Leading
      FROM CTE   
    ),
    
    cte2 as (select *
      ,case when cte1.row_nbr = 1 & cte1.Lagging=cte1.ProductTypeCode then cte1.OpenDate else
       case when cte1.Lagging<>cte1.ProductTypeCode then cte1.FullDate else NULL END END as NewOpen
      ,case when cte1.ClosedDate IS NOT NULL then cte1.ClosedDate else 
       case when cte1.Leading <> cte1.ProductTypeCode then cte1.FullDate else NULL END END as NewClosed
      FROM cte1
    );"))
    

    q5如前所述,
    WITH
    是定义最终查询中使用的CTE的语句。您的查询仅包含CTE定义,但从未在最终语句中实际使用任何定义。此外,由于窗口函数可以在任何级别上运行,因此可以将前两个CTE组合在一起。最后一个CTE可能可以作为您的最终
    SELECT
    语句

    sql <- "WITH CTE AS
             (SELECT 
                  oz.id AS AccountID
                 , ac.PROD_TYPE_CDE as ProductTypeCode
                 , CASE 
                        WHEN ac.OPEN_DTE='0001-01-01' 
                        THEN NULL 
                        ELSE ac.OPEN_DTE 
                   END AS OpenDate
                 , CASE 
                        WHEN ac.CLOS_DTE = '0001-01-01' 
                        THEN NULL 
                        ELSE ac.CLOS_DTE
                   END AS ClosedDate
                 , df.proc_dte AS FullDate
    
                 , ROW_NUMBER() OVER (PARTITION BY oz.id 
                                      ORDER BY oz.id, df.proc_dte) AS row_nbr 
                 , ROW_NUMBER() OVER (PARTITION BY oz.id, ac.PROD_TYPE_CDE 
                                      ORDER BY oz.id, df.proc_dte) AS row_nbr2
                 , LAG(ac.PROD_TYPE_CDE) OVER (PARTITION BY oz.id 
                                               ORDER BY df.proc_dte) AS Lagging
                 , LEAD(ac.PROD_TYPE_CDE) OVER (PARTITION BY oz.id
                                                ORDER BY df.proc_dte) AS Leading
              FROM
                  dbs.tb_dbs_acct_fact df
              INNER JOIN
                  dbs.tb_acct_details ac ON df.dw_serv_id = ac.dw_serv_id
              LEFT OUTER JOIN
                  dbs.tb_oz_id oz ON df.proc_dte = oz.proc_dte 
             )
    
          SELECT *
              , CASE 
                    WHEN row_nbr = 1 & Lagging = ProductTypeCode 
                    THEN OpenDate 
                    ELSE
                        CASE
                            WHEN Lagging <> ProductTypeCode 
                            THEN FullDate 
                            ELSE NULL 
                        END 
                END AS NewOpen
              , CASE 
                    WHEN ClosedDate IS NOT NULL 
                    THEN ClosedDate 
                    ELSE 
                        CASE 
                            WHEN Leading <> ProductTypeCode 
                            THEN FullDate 
                            ELSE NULL 
                        END 
                END AS NewClosed
          FROM CTE;"
    
    q5 <- sqlQuery(ch, sql)
    

    sql如前所述,
    WITH
    是定义要在最终查询中使用的CTE的语句。您的查询仅包含CTE定义,但从未在最终语句中实际使用任何定义。此外,由于窗口函数可以在任何级别上运行,因此可以将前两个CTE组合在一起。最后一个CTE可能可以作为您的最终
    SELECT
    语句

    sql <- "WITH CTE AS
             (SELECT 
                  oz.id AS AccountID
                 , ac.PROD_TYPE_CDE as ProductTypeCode
                 , CASE 
                        WHEN ac.OPEN_DTE='0001-01-01' 
                        THEN NULL 
                        ELSE ac.OPEN_DTE 
                   END AS OpenDate
                 , CASE 
                        WHEN ac.CLOS_DTE = '0001-01-01' 
                        THEN NULL 
                        ELSE ac.CLOS_DTE
                   END AS ClosedDate
                 , df.proc_dte AS FullDate
    
                 , ROW_NUMBER() OVER (PARTITION BY oz.id 
                                      ORDER BY oz.id, df.proc_dte) AS row_nbr 
                 , ROW_NUMBER() OVER (PARTITION BY oz.id, ac.PROD_TYPE_CDE 
                                      ORDER BY oz.id, df.proc_dte) AS row_nbr2
                 , LAG(ac.PROD_TYPE_CDE) OVER (PARTITION BY oz.id 
                                               ORDER BY df.proc_dte) AS Lagging
                 , LEAD(ac.PROD_TYPE_CDE) OVER (PARTITION BY oz.id
                                                ORDER BY df.proc_dte) AS Leading
              FROM
                  dbs.tb_dbs_acct_fact df
              INNER JOIN
                  dbs.tb_acct_details ac ON df.dw_serv_id = ac.dw_serv_id
              LEFT OUTER JOIN
                  dbs.tb_oz_id oz ON df.proc_dte = oz.proc_dte 
             )
    
          SELECT *
              , CASE 
                    WHEN row_nbr = 1 & Lagging = ProductTypeCode 
                    THEN OpenDate 
                    ELSE
                        CASE
                            WHEN Lagging <> ProductTypeCode 
                            THEN FullDate 
                            ELSE NULL 
                        END 
                END AS NewOpen
              , CASE 
                    WHEN ClosedDate IS NOT NULL 
                    THEN ClosedDate 
                    ELSE 
                        CASE 
                            WHEN Leading <> ProductTypeCode 
                            THEN FullDate 
                            ELSE NULL 
                        END 
                END AS NewClosed
          FROM CTE;"
    
    q5 <- sqlQuery(ch, sql)
    

    sql您从不从CTEs中选择
    ;声明不完整。谢谢你的评论。当你说我从不
    从CTEs中选择
    时,你能再详细说明一下吗?我想我没有跟踪你,我想我现在跟踪你了。你的意思是在我的代码末尾,我需要包括
    SELECT*FROM CTE,cte1
    @a_js12是的,你需要包括最后的SELECT。使用CTE的通常模式是
    ,cte1为(…),CTE2为(…),选择…
    。您没有最终选择。您从未从CTEs中选择
    ;声明不完整。谢谢你的评论。当你说我从不
    从CTEs中选择
    时,你能再详细说明一下吗?我想我没有跟踪你,我想我现在跟踪你了。你的意思是在我的代码末尾,我需要包括
    SELECT*FROM CTE,cte1
    @a_js12是的,你需要包括最后的SELECT。使用CTE的通常模式是
    ,cte1为(…),CTE2为(…),选择…
    。您没有最终选择。