选择最近的时间戳行并从具有 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,同时保持最高时间戳行 [重复]

如何在 Swift / iOS 中从 UITableView 中删除行并从 UserDefaults 中更新数组

SQL:选择具有最大值的行并按单列分组

如何选择具有最新日期的行并根据该行计算另一个字段

从表视图中删除行并从 sqlite 数据库中删除记录

DT::datatable - 选择要删除的行并写入没有闪亮的 csv