当前位置: 首页 > 知识库问答 >
问题:

数据库和Spark中的通用表表达式

黎阳冰
2023-03-14
+----------+----------+------+---+---+---------+-----------------+
| data_date|   user_id|region|sex|age|age_group|sum(duration_min)|
+----------+----------+------+---+---+---------+-----------------+
|2020-01-01|22600560aa|     1|  1| 28|        2|              0.0|
|2020-01-01|17148900ab|     6|  2| 60|        5|           1138.0|
|2020-01-01|21900230aa|     5|  1| 43|        4|              0.0|
|2020-01-01|35900050ac|     8|  1| 16|        1|            224.0|
|2020-01-01|22300280ad|     6|  2| 44|        4|              8.0|
|2020-01-02|19702160ac|     2|  2| 55|        5|              0.0|
|2020-02-02|17900020aa|     5|  2| 64|        5|            264.0|
|2020-02-02|16900120aa|     3|  1| 69|        6|              0.0|
|2020-02-02|11160900aa|     6|  2| 52|        5|              0.0|
|2020-03-02|16900290aa|     5|  1| 37|        3|              0.0|
+----------+----------+------+---+---+---------+-----------------+
%sql


    WITH regs AS (
      SELECT
        user_id,
        MIN(data_date) AS reg_date
      FROM df2
      GROUP BY user_id)
    
    SELECT
      month(reg_date)  AS reg_month,
      COUNT(DISTINCT user_id) AS users
    FROM regs
    GROUP BY reg_month
    ORDER BY reg_month ASC;
%sql

WITH regs AS (
  SELECT
    user_id,
    MIN(data_date) AS reg_date
  FROM df2
  GROUP BY user_id
  ),

  regs_per_month AS (
    SELECT
      month(reg_date) AS reg_month,
      COUNT(DISTINCT user_id) AS users
    FROM regs
    GROUP BY reg_month
  )

SELECT
  reg_month,
  users,
  LAG(users, 1) OVER (ORDER BY regs_per_month ASC) AS previous_users
FROM regs_per_month
ORDER BY reg_month ASC;

以下是错误消息

Error in SQL statement: AnalysisException: cannot resolve '`regs_per_month`' given input columns: [regs_per_month.reg_month, regs_per_month.users]; line 20 pos 31;
'Sort ['reg_month ASC NULLS FIRST], true

共有1个答案

林龙野
2023-03-14

您可以简单地使用逗号在Spark SQL中嵌套公共表表达式,例如

%sql
;WITH regs AS (
SELECT
  user_id,
  MIN(data_date) AS reg_date
FROM df2
GROUP BY user_id
),
regs_per_month AS (
SELECT
  month(reg_date) AS reg_month,
  COUNT(DISTINCT user_id) AS users
FROM regs
GROUP BY reg_month
)
SELECT
  reg_month,
  users,
  LAG(users, 1) OVER (ORDER BY reg_month ASC) AS previous_users
FROM regs_per_month
ORDER BY reg_month ASC;

如前所述,您的lag语句应该引用reg_month列,而不是regs_per_monthCTE。

作为嵌套CTE的另一种方式,您可以使用多个with语句,例如

%sql
;WITH regs_per_month AS ( 
  WITH regs AS ( 
  SELECT
    user_id,
    MIN(data_date) AS reg_date
  FROM df2
  GROUP BY user_id
  )
  SELECT 
    month(reg_date) AS reg_month,
    COUNT(DISTINCT user_id) AS users
  FROM regs
  GROUP BY reg_month
)
SELECT 
  reg_month, 
  users,
  LAG( users, 1 ) OVER ( ORDER BY reg_month ASC ) AS previous_users
FROM regs_per_month
ORDER BY reg_month ASC;
 类似资料:
  • 我尝试将< code>bytea数据从一个表移动到另一个表,在一个查询中更新引用。 因此,我想从用于插入的查询中返回不用于插入的数据。 但我得到了一个查询错误: 我想做这样的事情: 但我无法获取用于插入的所有数据,我无法从子选择返回id。 我受到这个关于如何使用通用表表达式做到这一点的答案的启发,但我找不到一种方法来使它工作。

  • 问题内容: 我想构建一个通用Web表单的后端,其中包含用户可以回答的问题。有多种类型的问题。 “普通”文本问题:通过一个简单的文本字段回答该问题。 示例 :一般的个人信息,例如姓名。 Textarea问题:相同,但是有更多的空间来写答案。 示例 :“您想要添加的更多信息”框。 多选题:带有一些预定义答案的问题,可以从中选择一个。 示例 :您对PHP的编程程度如何?[]不太好[]平均[]我已经写过这

  • 问题内容: 假设我有一个通用接口: 和方法sort: 我可以调用此方法并将lambda表达式作为参数传递: 那会很好的。 但是现在,如果我将接口设为非泛型,并且将方法设为泛型: 然后像这样调用: 它不会编译。它在lambda表达式中显示错误: “目标方法是通用的” 好的,当我使用编译时,它显示以下错误: 从此错误消息看来,编译器似乎无法推断类型参数。是这样吗 如果是,那为什么会这样呢? 我尝试了各

  • 我希望有一个通用的框架来编写一些正则表达式中的语法验证规则,这样我就可以在前端和后端都使用它们。我使用javascript作为前端,使用java作为后端。我想在前端做一个表单提交,但是在提交表单之前,我需要执行一些语法规则检查。当请求到达后端时,我希望评估相同的规则集。 我想把这些规则放在一个可以加载javascript和java代码的公共位置,这样我只需要更改这个公共位置的规则,它们就会反映到两

  • 问题内容: 我正在使用带有SQL数据库的C#开发应用程序。 我有一个模型: 我想将其表示为表格。 表格的哪些正确字段? 问题答案: 这取决于该人与他将负责的其他人之间存在什么样的关系。 如果是父母与子女的关系,即 组成 关系,则可以使用自我参考表。就像是: 包含以下各列: , 。 相同表的外键。 如果一个人与其他人之间的关系是一个 集合 ,并且一个人可能对其他许多事情负责: , 。 : , , 。

  • 问题内容: 如何使用查询获取SQL Server数据库中所有表的列表。我的意图是将其动态显示在网页上。 问题答案: 尝试: 这应该给您您想要的。然后,您需要从网页中调用它,以所需格式显示。 您可能要看: 如何使用C#在组合框中从数据库获取所有表的名称 可能会帮助您完成您想做的事情。 另外-您可能想看一下SQL Server:我应该在sys表上使用information_schema表吗? 用于sy