Teradata 在子查询中使用partition子句
我是TD的新手,需要一些关于以下问题的帮助 我们有一个查询,其中from子句如下所示:Teradata 在子查询中使用partition子句,teradata,partition,Teradata,Partition,我是TD的新手,需要一些关于以下问题的帮助 我们有一个查询,其中from子句如下所示: `*sel * FROM V_ACOR ACOR, V_ORTR ORTR, V_MSAC MSAC, V_MSRC MSRC, V_REOR REOR WHERE ACOR.ORDER_ID = ORTR.ORDER_ID AND (SELECT MIN(ARRIVE_DATE_ORTR) AS ARRIVE_DATE FROM V_ORTR ) BETWEEN MSAC.BEGIN_DATE
`*sel *
FROM
V_ACOR ACOR,
V_ORTR ORTR,
V_MSAC MSAC,
V_MSRC MSRC,
V_REOR REOR
WHERE
ACOR.ORDER_ID = ORTR.ORDER_ID
AND
(SELECT MIN(ARRIVE_DATE_ORTR) AS ARRIVE_DATE FROM V_ORTR )
BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND
(SELECT MIN(ARRIVE_DATE_ORTR) AS ARRIVE_DATE FROM V_ORTR )
BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
AND
(SELECT MIN(ARRIVE_DATE_REOR) AS ARRIVE_DATE FROM V_REOR )
BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND
(SELECT MIN(ARRIVE_DATE_REOR) AS ARRIVE_DATE FROM V_REOR )
BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE*`
现在的问题是,所有情况下的最小值(到达日期),给我所有条目的最小值。我们的要求是根据订单ID获取最小日期。因此,我们尝试用以下内容代替最小日期(到达日期):
这显示了一个错误:
子查询中不允许使用有序分析函数。
我们也尝试了以下方法:
`*sel * from
(
sel A.*
from (sel * FROM V_ORTR
QUALIFY row_NUMBER() over (PARTITION by ORTR.ORDER_ID order by ORTR.ARRIVE_DATE ASC)=1
) A ,
sel B.*
from (sel * FROM V_REOR
QUALIFY row_NUMBER() over (PARTITION by REOR.ORDER_ID order by REOR.ARRIVE_DATE_ORDR_TR ASC)=1
)B ,
V_ACOR,
V_MSAC,
V_MSRC
WHERE
ACOR.ORDER_ID_ORDR = A.ORDER_ID
AND A.ARRIVE_DATE_ORTR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND A.ARRIVE_DATE_ORTR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
)*`
这也给出了以下错误:
语法错误,应为名称或Unicode分隔标识符或“(“between.”和“sel”关键字。不能在子查询中使用OLAP函数,因为它们可能相互关联。有一个技巧可以处理此特定错误:将其移动到子查询中的派生表中(无法关联到派生表): 但这将不起作用,因为它将返回多个带有 “3669子查询返回了多个值” 第二次尝试时出现了一些语法错误。此外,您不需要将OLAP函数嵌套在派生表中,因为它已经存在于派生表中。有些人(或更好的是很多人)将“派生表”称为“子查询”,在Oracle中称为“Inlie视图”,因此命名可能也会混淆:
SELECT *
FROM
(
SELECT * FROM V_ORTR
QUALIFY ROW_NUMBER() OVER (PARTITION BY ORTR.ORDER_ID ORDER BY ORTR.ARRIVE_DATE ASC) = 1
) A ,
(
SELECT * FROM V_REOR
QUALIFY ROW_NUMBER() OVER (PARTITION BY REOR.ORDER_ID ORDER BY REOR.ARRIVE_DATE_ORDR_TR ASC) = 1
) B,
V_ACOR,
V_MSAC,
V_MSRC
WHERE
ACOR.ORDER_ID_ORDR = A.ORDER_ID
AND A.ARRIVE_DATE_ORTR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND A.ARRIVE_DATE_ORTR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
但是你是舒尔吗?这些都是连接条件?我希望有一些附加条件,至少A.ORDER\u ID=B.ORDER\u ID你不能在子查询中使用OLAP函数,因为它们可能是相关的。有一个技巧可以处理这个特定错误:将其移动到子查询中的派生表中(无法关联到派生表): 但这将不起作用,因为它将返回多个带有 “3669子查询返回了多个值” 第二次尝试时出现了一些语法错误。此外,您不需要将OLAP函数嵌套在派生表中,因为它已经存在于派生表中。有些人(或更好的是很多人)将“派生表”称为“子查询”,在Oracle中称为“Inlie视图”,因此命名可能也会混淆:
SELECT *
FROM
(
SELECT * FROM V_ORTR
QUALIFY ROW_NUMBER() OVER (PARTITION BY ORTR.ORDER_ID ORDER BY ORTR.ARRIVE_DATE ASC) = 1
) A ,
(
SELECT * FROM V_REOR
QUALIFY ROW_NUMBER() OVER (PARTITION BY REOR.ORDER_ID ORDER BY REOR.ARRIVE_DATE_ORDR_TR ASC) = 1
) B,
V_ACOR,
V_MSAC,
V_MSRC
WHERE
ACOR.ORDER_ID_ORDR = A.ORDER_ID
AND A.ARRIVE_DATE_ORTR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND A.ARRIVE_DATE_ORTR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
但您是舒尔吗?这些都是加入条件?我希望有一些附加条件,至少A.ORDER_ID=B.ORDER_ID您使用的是哪个DBMS(和版本)?Postgres?Oracle?SQL Server?DB2?谢谢您的回复。我们使用的是Teradata版本13哪个DBMS(和版本)您正在使用?Postgres?Oracle?SQL Server?DB2?谢谢您的回复。我们正在使用Teradata 13版谢谢您的回复。我们还有两个连接。是的,OEDER_ID上的连接也在那里。谢谢您的回复。我们还有两个连接。是的,OEDER_ID上的连接也在那里。
SELECT *
FROM
(
SELECT * FROM V_ORTR
QUALIFY ROW_NUMBER() OVER (PARTITION BY ORTR.ORDER_ID ORDER BY ORTR.ARRIVE_DATE ASC) = 1
) A ,
(
SELECT * FROM V_REOR
QUALIFY ROW_NUMBER() OVER (PARTITION BY REOR.ORDER_ID ORDER BY REOR.ARRIVE_DATE_ORDR_TR ASC) = 1
) B,
V_ACOR,
V_MSAC,
V_MSRC
WHERE
ACOR.ORDER_ID_ORDR = A.ORDER_ID
AND A.ARRIVE_DATE_ORTR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND A.ARRIVE_DATE_ORTR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSAC.BEGIN_DATE AND MSAC.END_DATE
AND B.ARRIVE_DATE_REOR BETWEEN MSRC.BEGIN_DATE AND MSRC.END_DATE