由于Postgres能够进行LATERAL
连接,我一直在阅读它,因为我目前为我的团队执行复杂的数据转储,其中包含大量低效的子查询,这使得整个查询需要四分钟或更长时间.
我知道LATERAL
联接可能能够帮助我,但即使在阅读了像Heap Analytics 这样的文章之后,我仍然没有完全遵循.
LATERAL
加入的用例是什么?LATERAL
连接和子查询之间有什么区别?
我有一张镶有桌子的镶木桌子
,array <struct <col1,col2,.. colN >>
可以使用LATERAL VIEW语法在Hive中对此表运行查询.
如何将此表读入RDD,更重要的是如何在Spark中过滤,映射等嵌套集合?
在Spark文档中找不到对此的任何引用.提前感谢您的任何信息!
PS.感觉可能有助于在桌子上给出一些统计数据.主表~600中的列数.行数~200m.嵌套集合中的"列"数〜10.平均集合中的平均记录数~35.
LATERAL FLATTEN(...)
Snowflake 中和 的使用有什么区别TABLE(FLATTEN(...))
?FLATTEN
我检查了,LATERAL
和的文档,TABLE
无法明确以下查询之间的功能差异。
select
id as account_id,
account_regions.value::string as region
from
salesforce.accounts,
lateral flatten(split(salesforce.accounts.regions, ', ')) account_regions
Run Code Online (Sandbox Code Playgroud)
select
id as account_id,
account_regions.value::string as region
from
salesforce.accounts,
table(flatten(split(salesforce.accounts.regions, ', '))) account_regions
Run Code Online (Sandbox Code Playgroud) 我试试这个
select created_at,
sum((json_array_elements(shipping_lines::json) ->> 'price')::float) as shipping_price
from t1
group by 1
Run Code Online (Sandbox Code Playgroud)
它显示错误:
错误:聚合函数调用不能包含设置返回函数调用第 5 行:sum(((json_array_elements(shipping_lines::json) ->> 'price')... ^ 提示:您也许可以移动设置返回函数进入 LATERAL FROM 项目。
如何使用 Lateral From 解决这个问题?我读了这个 PsSQL 文档,但并没有真正理解横向功能
我有一个lateral join
这样的定义:
select A.id, B.value
from A
left join lateral (
select value
from B
where B.id = A.id
limit 1
) as X on true;
Run Code Online (Sandbox Code Playgroud)
它具有limit 1
内部的特殊点(在更复杂的情况下,我可以在连接中有一些额外的选项来缩小值和/或)order by
。我知道 Spark-SQL 目前还没有这样的东西,那么我怎样才能找到解决方法呢?
我试图找到一个关于从MSSQL到PostgreSQL的等效使用OUTER APPLY的SQL查询,但似乎很难找到.
我的MSSQL示例查询是这样的.
希望有人可以帮我解决我的问题.提前致谢.
SELECT table1.col1, table1.col2, Supp.ID, Supp.Supplier
FROM SIS_PRS table1
OUTER APPLY (SELECT TOP 1 ID, SupplierName FROM table2 WHERE table2.ID = table1.SupplierID) AS Supp
Run Code Online (Sandbox Code Playgroud) 我正在尝试运行以下查询:
SELECT
tc.ID_NUMBER AS AFC_RPP_Number,
hc.BUSINESS AS Business,
hc.DIRECTOR AS Director,
tc.REASON_FOR_REVISION AS Description_of_Change
FROM alo_gg.AWS_PIM tc
left join lateral(
select BUSINESS,DIRECTOR
FROM alo_ggg.tracker
WHERE START_DATE <= tc.DATE AND SO = tc.SO
ORDER BY START_DATE DESC
LIMIT 1
) hc;
Run Code Online (Sandbox Code Playgroud)
上面的查询显示错误:
ERROR: syntax error at or near "SELECT"
left join lateral (SELECT BUSINESS,DIRECTOR...
Run Code Online (Sandbox Code Playgroud)
如果我单独运行子查询,它会给我一个结果,但lateral
它会给我一个错误。
由于 JSON 支持,我正在考虑切换到 PostgreSQL。但是,我想知道,是否可以通过单个查询实现以下功能:
假设有两个表:
表 1) 组织:
ID (INT) | members (JSONB) |
------------+---------------------------------------------------------|
1 | [{ id: 23, role: "admin" }, { id: 24, role: "default" }]|
2 | [{ id: 23, role: "user" }]
Run Code Online (Sandbox Code Playgroud)
表2)用户:
ID (INT) | name TEXT | email TEXT |
------------+-----------+---------------|
23 | Max | max@gmail.com |
24 | Joe | joe@gmail.com |
Run Code Online (Sandbox Code Playgroud)
现在我想得到这样的结果(我只有组织的 ID [1]):
ID (INT) | members (JSONB) |
------------+--------------------------------------------------------|
1 | [{ id: 23, name: "Max", email: "max@gmail.com", role: …
Run Code Online (Sandbox Code Playgroud) 我在 timescale db 中有一个表 tab1,它有 3 列标签、时间、值。time 和 tag 组成了表的 pk:(time, tag)。
行数超过 500 万行。我需要找到 N 个标签中每个标签的最新时间戳或最大(时间)。
我尝试过的事情很少,我将与大家分享我的经验:
SELECT "time", "tag", "value"
FROM tab1
WHERE ("tag","time") IN
(SELECT "tag", MAX("time") FROM tab1 WHERE "tag" IN(tag1,tag2) GROUP BY "tag" );
Run Code Online (Sandbox Code Playgroud)
这是给出结果,但需要大约 19 秒来执行,这超出了可接受的限制
SELECT tag, last(time, time), last(value,time)
FROM tab1
WHERE "tag" IN (tag1,tag2) GROUP BY "tag" ;
Run Code Online (Sandbox Code Playgroud)
这会在 10 秒内给出输出。
我需要找到另一种类似于第二个解决方案的可行解决方案,该解决方案可能性能更好。我尝试了一些其他的东西,如 LATERAL JOIN (3)、WINDOW FUNCTIONS (ROW_NUMBER, PARTITION) (4),但解决方案并不符合预期。
SELECT table1."tag", table1."time",table1."value" from tab1 as table1 …
Run Code Online (Sandbox Code Playgroud) 以下是 aws 网站的片段:
WITH dataset AS (
SELECT ARRAY[
CAST(
ROW('aws.amazon.com', ROW(true)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
),
CAST(
ROW('news.cnn.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
),
CAST(
ROW('netflix.com', ROW(false)) AS ROW(hostname VARCHAR, flaggedActivity ROW(isNew BOOLEAN))
)
] as items
)
SELECT sites.hostname, sites.flaggedActivity.isNew
FROM dataset, UNNEST(items) t(sites)
WHERE sites.flaggedActivity.isNew = true;
Run Code Online (Sandbox Code Playgroud)
它有效!但什么t(sites)
意思呢?当我尝试使用真实表而不是dataset
我收到错误时Table 'site' not found
。
它看起来很奇怪 - 就像用关键字调用的函数一样UNNEST
。有人能解释一下这是什么吗?
arrays amazon-web-services presto amazon-athena lateral-join
lateral-join ×10
postgresql ×5
sql ×5
arrays ×3
apache-spark ×2
json ×2
flatten ×1
greenplum ×1
nested ×1
parquet ×1
presto ×1
snowflake-cloud-data-platform ×1
sql-server ×1
subquery ×1
time-series ×1
timescaledb ×1