选择最近的时间戳行并从具有 Variant DataType 的列中获取值
Posted
技术标签:
【中文标题】选择最近的时间戳行并从具有 Variant DataType 的列中获取值【英文标题】:Selecting most recent timestamp row and getting values from a column with a Variant DataType 【发布时间】:2020-10-26 19:53:16 【问题描述】:我希望标题有意义,如果我应该使它更具可读性,我愿意接受建议。
我在 Snowflake 中有一个名为 BI_Table_Temp 的临时表。它有 2 列 Load_DateTime,数据类型为 Timestamp_LTZ(9) 和 JSON_DATA,它是一种 Variant 数据类型,具有来自 JSON 文件的嵌套记录。我想查询此表,然后计划将其提取到另一个表中,但我想确保始终获得最新的 Load_DateTime 行。
我试过这个,它有效,但它显示了 Load_DateTime 列,我不希望我只想从具有最大 Load_DateTime 时间戳的 JSON_DATA 行中获取值:
SELECT
MAX(Load_DateTime),
transactions.value:id::string as id
transactions.value:value2::string as account_value
transactions.value:value3::string as new_account_value
FROM BI_Table_Temp,
LATERAL FLATTEN (JSON_DATA:transactions) as transactions
GROUP BY transactions.value
【问题讨论】:
【参考方案1】:一个简单的选择:
WITH data AS (
SELECT Load_DateTime
, transactions.value:id::string as id
, transactions.value:value2::string as account_value
, transactions.value:value3::string as new_account_value
FROM BI_Table_Temp,
LATERAL FLATTEN (JSON_DATA:transactions) as transactions
), max_load AS (
SELECT MAX(Load_DateTime) Load_DateTime, id
FROM data,
GROUP BY id
)
SELECT transactions.value:id::string as id
, transactions.value:value2::string as account_value
, transactions.value:value3::string as new_account_value
FROM data
JOIN max_load
USING (id, Load_DateTime)
由于transactions.value
是一个变体,我猜想GROUP BY transactions.value
是指GROUP BY transactions.value:id
。
【讨论】:
嗨@Felipe,感谢您的回复。我刚刚尝试了您的代码,但出现以下错误:SQL 编译错误:位置 0 处的错误第 16 行无效标识符“TRANSACTIONS.VALUE”。这来自第二个选择语句的第一行:transactions.value:id::string as id 我试图从 BI_Table_Temp 获取最后一个 Load_DateTime,并使用该 JSON_DATA 行中的值(这是一个变体数据类型和我正在使用 transactions.value 从该行获取嵌套值)。然后我打算将其复制到另一个表中 如果您可以在问题中发布正在运行的查询,这将有很大帮助。我知道您发布的起始地址不起作用,因为它甚至缺少逗号。我只是尽力用你提供的东西。话虽如此 - 我只是在我的答案中添加了一个缺少的逗号。你能再试一次吗? 嗨@Felipe 感谢您提出该错误,我刚刚修复了查询中缺少的逗号,目前它适用于我的更改,但我不希望它显示 Load_DateTime 列,因为它是它在 select 语句中,我想确保我总是从我的临时表中获取最后一个 Load_DateTime 列。我仍然遇到同样的错误(我还在“GROUP BY”之前的“data”之后删除了查询中的逗号,因为这给了我一个错误)。以上是关于选择最近的时间戳行并从具有 Variant DataType 的列中获取值的主要内容,如果未能解决你的问题,请参考以下文章
spark:如何在数据帧上进行 dropDuplicates,同时保持最高时间戳行 [重复]