标签: common-table-expression

通过递归 CTE 使用 SQLAlchemy 获取层次结构的顶级父 ID

我有这样一个案例:

|               Note table               |
|---------------------|------------------|
|          id         |     parent_id    |
|---------------------|------------------|
|          1          |     Null         |
|---------------------|------------------|
|          2          |      1
|---------------------|------------------|
|          3          |      2
|---------------------|------------------|
|          4          |      3
|---------------------|------------------|
Run Code Online (Sandbox Code Playgroud)

我想要实现的是获取顶级父 ID。在这种情况下,如果我传递 ID 号 4,我将得到 Id 1,因为 Id 1 是顶级父级。当parent_id 达到 null 时,意味着该 id 是顶级父级。

我已经尝试过了,但返回的是我传递给函数的 Id。

  def get_top_level_Note(self, id: int):


        hierarchy = self.db.session.query(Note).filter(Note.id == id).cte(name="hierarchy", recursive=True)

        parent = aliased(hierarchy, name="p")
        children = aliased(Note, name="c")

        hierarchy = hierarchy.union_all(self.db.session.query(children).filter(children.parent_id == parent.c.id))

        result = self.db.session.query(Note).select_entity_from(hierarchy).all()
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy common-table-expression

1
推荐指数
1
解决办法
1119
查看次数

语法错误:应为“(”或“,”或关键字 SELECT,但已到达脚本结尾

我只是按照课程中的查询进行操作,但我无法弄清楚为什么收到错误消息。

语法错误:应为“(”或“,”或关键字 SELECT,但在 [13:6] 处结束脚本

With 
longest_used_bike AS (
    SELECT 
        Bikeid,
        SUM(duration_minutes) AS trip_duration
    FROM 
        bigquery-public-data.austin_bikeshare.bikeshare_trips
    GROUP BY 
        Bikeid
    ORDER BY 
        Trip_duration DESC
    LIMIT 1
)
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误?

sql common-table-expression google-bigquery

1
推荐指数
1
解决办法
3万
查看次数

MATCH_RECOGNIZE 与 Snowflake 中的 CTE

MATCH_RECOGNIZE我在带有一些 CTE 的查询中使用函数。当我运行查询时,出现以下错误:

SQL 编译错误:在此上下文中不支持 MATCH_RECOGNIZE。

在我的查询中,MATCH_RECOGNIZE 之前和之后有几个 CTE,部分如下。

WITH cte1 AS (
SELECT *
FROM dataset
WHERE ID IS NOT NULL AND STATUS IS NOT NULL ),

cte2 AS (
SELECT *
FROM cte1
QUALIFY FIRST_VALUE(STATUS) OVER (PARTITION BY ID ORDER BY CREATED_AT) = 'created' )

mr as (
SELECT *
    FROM cte2
    MATCH_RECOGNIZE (
      PARTITION BY ID
      ORDER BY CREATED_AT
      MEASURES MATCH_NUMBER() AS mn,
               MATCH_SEQUENCE_NUMBER AS msn
      ALL ROWS PER MATCH
      PATTERN (c+m+)
      DEFINE
         c AS status='created' …
Run Code Online (Sandbox Code Playgroud)

sql common-table-expression sql-view snowflake-cloud-data-platform match-recognize

1
推荐指数
1
解决办法
554
查看次数

SQL递归查询获取部门代码

我需要生成用户部门代码列表。如果用户没有代码,则获取其经理代码,依此类推。

初始表如下所示:

manager emp     code
-----------------------
boss    subboss AAA
boss    subsub  SUBCODE
subboss john    ABC
subboss alan    (null)
(null)  boss    ZZZ
subsub  steve   (null)
steve   rick    (null)

CREATE TABLE Users
(
     [manager] varchar(10), 
     [emp] varchar(10), 
     [code] varchar(10)
);
    
INSERT INTO Users ([manager], [emp], [code])
VALUES
    ('boss', 'subboss', 'AQQ'),
    ('boss', 'subsub', 'SUBSUB'),
    ('subboss', 'john', 'ABC'),
    ('subboss', 'alan', null),
    (null, 'boss', 'ZZZ'),
    ('subsub', 'steve', null),
    ('steve', 'rick', null);
Run Code Online (Sandbox Code Playgroud)

期望的结果是这样的:

manager emp     code
------------------------
boss    subboss AAA
boss    subsub  SUBCODE
subboss john    ABC …
Run Code Online (Sandbox Code Playgroud)

sql sql-server recursion hierarchy common-table-expression

1
推荐指数
1
解决办法
340
查看次数

为范围内的每个日期创建一行,并为 SQL 中的记录的日期范围内的每一天添加 1

假设我有一个日期范围 @StartDate = 2022-01-01 和 @EndDate = 2022-02-01,这是一个报告期。

此外,我还有客户记录,其中每个客户都有一个 LIVE Date 和一个 ServiceEndDate (或 ServiceEndDate = NULL,因为他们是持续客户)

某些客户的实时日期和服务结束日期范围可能超出报告期间范围。我只想报告几天他们是该期间的客户。

姓名 实时约会 服务结束日期
汤姆 2021-10-11 2022-01-13
标记 2022-11-13 2022-02-15
安迪 2022-01-02 2022-02-10
2022-01-09 2022-01-14

我想创建一个表,其中 A 列是日期(在报告期间的每个日期之间迭代),B 列是该日期的客户数量总和。

像这样的东西

日期 客户数量
2022-01-01 2
2022-01-02 3
2022-01-03 3
2022-01-04 3
2022-01-05 3
2022-01-06 3
2022-01-07 3
2022-01-08 3
2022-01-09 4
2022-01-10 4
2022-01-11 4
2022-01-12 4
2022-01-13 4
2022-01-14 3
2022-01-15 3

依此类推,直到@EndDate结束

任何帮助将不胜感激,谢谢。

sql t-sql sql-server common-table-expression

1
推荐指数
1
解决办法
2138
查看次数

使用递归CTE投射错误

我试图以.1为增量从-1到1生成一个数字列表.以下是代码给我一个错误:

WITH NumTab AS(
    SELECT -1.0 AS Num 
    UNION ALL 
    SELECT Num + .1
    FROM NumTab 
    WHERE Num <= 1.0
)
SELECT * FROM NumTab
Run Code Online (Sandbox Code Playgroud)

锚和递归查询"NumTab"列"Num"中的递归部分之间的类型不匹配.

我已经尝试将所有数字投射到decimal(2,1)结果中没有变化.必须有一些我不知道的明显的东西......

sql sql-server-2005 common-table-expression

0
推荐指数
1
解决办法
941
查看次数

使用CTE提供累计总数

我有一张桌子上有一些名字:

SELECT * FROM d;

Forename
--------------------------------
Robert
Susan
Frances
Kate
May
Alex
Anna
Run Code Online (Sandbox Code Playgroud)

我想按字母顺序提取累计名称长度.到目前为止,我有:

WITH    Names ( RowNum, Forename, ForenameLength )
          AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY forename ) AS RowNum ,
                        Forename ,
                        LEN(forename) AS ForenameLength
               FROM     d
             )
    SELECT  RowNum ,
            Forename ,
            ForenameLength ,
            ISNULL(ForenameLength + ( SELECT    ISNULL(SUM(ForenameLength),0)
                                      FROM      Names
                                      WHERE     RowNum < n.RowNum
                                    ), 0) AS CumLen
    FROM    NAMES n;

RowNum               Forename                         ForenameLength CumLen
-------------------- -------------------------------- -------------- -----------
1                    Alex                             4              4 …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression sql-server-2008 sql-server-2012

0
推荐指数
1
解决办法
564
查看次数

使用内部联接更新查询

为什么我在存储过程的这一部分中得到以下语法错误:

关键字"FROM"附近的语法不正确.


WITH CTE_Residence_Overtime
    AS
    (
      SELECT * 
      FROM #Residence
    )
    UPDATE t1 
    SET t1.over_time = t1.over_time + CONVERT(TIME, CAST(CTE_Residence_Overtime.overtimeHours AS VARCHAR(2))  
    FROM r_overtime AS t1
    INNER JOIN CTE_Residence_Overtime 
    ON t1.[trans_date] = CTE_Residence_Overtime.[dayDate];
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures inner-join common-table-expression

0
推荐指数
1
解决办法
73
查看次数

将两个CTE与UNION组合会导致错误

收到以下错误:

'消息156,级别15,状态1,行53
'关键字'WITH'附近的语法不正确.

消息319,级别15,状态1,行53
关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号结束前一个语句.

当单独运行CTE时,它很好.但是当使用UNION进行组合时,则会出现错误.

With cte1 as 
(
    select
       .
       .
       .

    Select

    from

)
select

UNION

With cte2 as 
(
    Select

    From
)
Select 

from
Run Code Online (Sandbox Code Playgroud)

sql sql-server common-table-expression

0
推荐指数
1
解决办法
30
查看次数

CTE之后的IF声明

今天,我遇到了与IF语句有关的怪异问题。完成替换/创建CTE之后,在CTE之后有IF语句,并不断出现以下错误:

'if'附近的语法不正确

查询:

-- Other CTE's above.
CTE6 AS 
(
    SELECT
        -- Multiple Columns
    FROM
        table1
)
-- When the Query runs, I'd like it to use the correct IF BLOCK.

-- Error starts here.
if @param_policy = '1' 
    select * from CTE4
    where mid not in (select distinct mid from CTE6)
        and [CN] = @param_policy

if @param_policy = '2' 
    select * from CTE4 
    where mid not in (select distinct mid from CTE6)
        and [CN] = @param_policy

if @param_policy = …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server common-table-expression

0
推荐指数
1
解决办法
98
查看次数