SQL:如何将查询结果另存为新的临时表?

问题描述

我是sql的初学者。如何将A部分的查询结果(已经使用WITH子句的多个子查询)保存为新的临时表,以便我可以将其用于B部分的查询(因为B部分中的汇总基于A部分) ?最后,我想分别得到A部分和B部分的结果。我试图从其他帖子中找到解决方案,但是它似乎不适用于我的问题,因为我使用WITH子句有多个子查询。预先感谢您的帮助!

/****** Part A ******/
WITH DL_source AS
    (SELECT
        LogID,HashID,DeviceDateTime,LAG(DeviceDateTime,1) OVER (PARTITION BY HashID ORDER BY HashID,LogID) AS Last_DeviceDateTime,TotalSecondsspent,PageViews,Pages,PrevPage,IEM,CommCode,ContentTag,SearchKeyword,TaggedMember,TargetMember
    FROM (SELECT
       ROW_NUMBER() OVER(ORDER BY HashID,DeviceDate,HourOfDay,MinOfHour,SecOfMin) AS LogID,CAST(DeviceDate AS DATETIME)                                                                
       + CAST(TIMEFROMPARTS(HourOfDay,SecOfMin,0) AS DATETIME) AS DeviceDateTime,TargetMember
    FROM [DM_RAW].[dbo].[WebAnalyticsVisit]                                 
    WHERE DeviceDate IS NOT NULL
    AND DeviceDate <> '1900-01-01'
    AND HashID IS NOT NULL
    AND HashID <> '') AS DL_DateTime),DL_Session_Source AS (
    SELECT
        LogID,Last_DeviceDateTime,DATEDIFF(MINUTE,LEAD(DeviceDateTime,1) OVER(PARTITION BY HashID ORDER BY DeviceDateTime ASC)) AS Min_btw_Page,CASE WHEN DATEDIFF(minute,DeviceDateTime) <30 THEN 0 ELSE 1 END AS New_Session_flag,TargetMember
    FROM DL_source)
SELECT
        LogID,Min_btw_Page,New_Session_flag,SUM(New_Session_flag) OVER (ORDER BY HashID,LogID) AS Session_Num,TargetMember
FROM DL_Session_Source

/****** Part B ******/
SELECT *,Session_Num,COUNT(*) AS Num_Page,MIN(DeviceDateTime) AS First_Page,MAX(DeviceDateTime) AS Last_Page
FROM #cte_Visit_Record_cheunghm4532
GROUP BY Session_Num,HashID

解决方法

快速简便选项:当您进入A部分底部的SELECT部分​​时,在其中插入一个INTO表达式。

请注意,为了简化/清晰起见,我减少了字段等的数量,并以...代替。

WITH DL_source AS
    (SELECT
    ... ),DL_Session_Source AS (
    SELECT ...
    FROM DL_source)
SELECT
        LogID,HashID
        ...,TargetMember
INTO #cte_Visit_Record_cheunghm4532        -- Added this row
FROM DL_Session_Source;

请注意,上面创建了一个新表-它不会插入到现有表中。

更全面/灵活的版本是首先创建临时表,然后将其替换为上面的SELECT,而不是上面的SELECT

CREATE TABLE #cte_Visit_Record_cheunghm4532 (LogID int,HashID varchar(32),...);

WITH DL_source AS
    (SELECT
    ... ),DL_Session_Source AS (
    SELECT ...
    FROM DL_source)
INSERT INTO #cte_Visit_Record_cheunghm4532 (LogID,HashID,...)
   SELECT LogID,HashID
         ...
   FROM DL_Session_Source;