【问题标题】:SQL: How do I save a query result as a new temp table?SQL:如何将查询结果保存为新的临时表?
【发布时间】:2021-02-06 03:48:48
【问题描述】:

我是 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, DeviceDateTime, 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
       ,HashID
       ,CAST(DeviceDate AS DATETIME)                                                                
       + CAST(TIMEFROMPARTS(HourOfDay, MinOfHour, SecOfMin,0 ,0) AS DATETIME) AS DeviceDateTime
       ,TotalSecondsSpent
       ,PageViews
       ,Pages
       ,PrevPage
       ,IEM
       ,CommCode
       ,ContentTag
       ,SearchKeyword
       ,TaggedMember
       ,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
        ,HashID
        ,DeviceDateTime
        ,Last_DeviceDateTime
        ,DATEDIFF(MINUTE, DeviceDateTime, LEAD(DeviceDateTime, 1) OVER(PARTITION BY HashID ORDER BY DeviceDateTime ASC)) AS Min_btw_Page
        ,CASE WHEN DATEDIFF(minute, Last_DeviceDateTime, DeviceDateTime) <30 THEN 0 ELSE 1 END AS New_Session_flag
        ,TotalSecondsSpent
        ,PageViews
        ,Pages
        ,PrevPage
        ,IEM
        ,CommCode
        ,ContentTag
        ,SearchKeyword
        ,TaggedMember
        ,TargetMember
    FROM DL_source)
SELECT
        LogID
        ,HashID
        ,DeviceDateTime
        ,Last_DeviceDateTime
        ,Min_btw_Page
        ,New_Session_flag
        ,SUM(New_Session_flag) OVER (ORDER BY HashID, DeviceDateTime, LogID) AS Session_Num
        ,TotalSecondsSpent
        ,PageViews
        ,Pages
        ,PrevPage
        ,IEM
        ,CommCode
        ,ContentTag
        ,SearchKeyword
        ,TaggedMember
        ,TargetMember
FROM DL_Session_Source

/****** Part B ******/
SELECT *,
    Session_Num
    ,HashID
    ,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 部分中的查询似乎与您的 B 部分完全无关。始终标记您实际使用的数据库,sql 只是一个标准的名称,并且经常在此处提及它的问题还需要提及数据库名称可回答的。指向标签并阅读工具提示
  • 嗨@Caius Jard,我很抱歉没有发布我正在使用的表格。下次我发布问题时,我会记住这一点。谢谢,祝你有美好的一天!

标签: sql variables subquery common-table-expression temp-tables


【解决方案1】:

快速简单的选项:当您到达 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,使其成为 INSERT 例如,

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;

【讨论】:

  • 天哪,又是你@seanb!!我在这里创建一个单独的帖子,因为我担心我打扰你太多,你出现并再次回答我的问题!你是我的英雄,在 24 小时内救了我两次哈哈
  • 但是为什么不把它变成另一个呢?
  • 临时表的主要优点是您可以对其进行多次分析。将数据压缩到一个临时表中,然后执行一个命令(如他的 B 部分),然后执行另一个不同的命令,等等。有时它还有助于基数估计和糟糕的计划 - 将查询分成两部分允许查询优化器重新启动在下半年有更好的估计(因此更好的表现)。但是,正如@Caius 所说,如果您只对最终输出执行一个命令,那么可以 - 您可以将其变成另一个“with”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 2023-01-12
  • 2021-11-09
  • 1970-01-01
  • 2015-11-12
相关资源
最近更新 更多