问题 运行 雪花 sql 中的最大函数和排序依据
Issues running Max function and Order by in snowflake sql
我是 snowflake 的新手,我正在尝试 运行 一个 sql 查询,该查询将为每个 ID 提取最大日期时间。以下是我的数据示例
Table 姓名:final_extract
id
datetime
ip
111
2022-02-03 11:37:58:000
62.44.134.97
222
2021-02-03 11:37:58:000
88.44.134.96
111
2022-02-01 11:37:58:000
22.44.134.97
111
2021-02-03 11:37:58:000
69.44.134.97
我想达到的目标
id
datetime
ip
111
2022-02-03 11:37:58:000
62.44.134.97
222
2021-02-03 11:37:58:000
88.44.134.96
下面的代码似乎没有达到我想要的效果。
select "id", MAX("datetime") As LastLoginDateTime, "ip "
from final_extract
group by "id ","ip "
order by MAX("datetime") DESC
limit 10
您的查询不起作用,因为每一行都有不同的 ip,您必须决定选择哪个。
看看吧,我选择ip最后一个值:
SELECT DISTINCT id
, MAX(datetime) OVER(PARTITION BY id) As LastLoginDateTime
, LAST_VALUE(ip) OVER(PARTITION BY id ORDER BY datetime) AS ip
FROM final_extract
ORDER BY LastLoginDateTime DESC
LIMIT 10;
Michael 的回答很好,但是如果您有很多行并且希望选择一些 rowa 并排除其余的,然后 QUALIFY option works very nicely, and using ROW_NUMBER 选择每组的首选行。
SELECT *
FROM VALUES
(111, '2022-02-03 11:37:58:000', '62.44.134.97'),
(222, '2021-02-03 11:37:58:000', '88.44.134.96'),
(111, '2022-02-01 11:37:58:000', '22.44.134.97'),
(111, '2021-02-03 11:37:58:000', '69.44.134.97')
v(id, datetime, ip_address)
QUALIFY row_number() over(partition by id order by datetime desc) = 1
因此为您 table 和专栏:
select id, datetime AS lastlogindatetime, "ip "
from final_extract
QUALIFY row_number() over ( partition by id order by datetime desc) = 1
order by 2 DESC
limit 10
比较简洁。
我是 snowflake 的新手,我正在尝试 运行 一个 sql 查询,该查询将为每个 ID 提取最大日期时间。以下是我的数据示例
Table 姓名:final_extract
id | datetime | ip |
---|---|---|
111 | 2022-02-03 11:37:58:000 | 62.44.134.97 |
222 | 2021-02-03 11:37:58:000 | 88.44.134.96 |
111 | 2022-02-01 11:37:58:000 | 22.44.134.97 |
111 | 2021-02-03 11:37:58:000 | 69.44.134.97 |
我想达到的目标
id | datetime | ip |
---|---|---|
111 | 2022-02-03 11:37:58:000 | 62.44.134.97 |
222 | 2021-02-03 11:37:58:000 | 88.44.134.96 |
下面的代码似乎没有达到我想要的效果。
select "id", MAX("datetime") As LastLoginDateTime, "ip "
from final_extract
group by "id ","ip "
order by MAX("datetime") DESC
limit 10
您的查询不起作用,因为每一行都有不同的 ip,您必须决定选择哪个。 看看吧,我选择ip最后一个值:
SELECT DISTINCT id
, MAX(datetime) OVER(PARTITION BY id) As LastLoginDateTime
, LAST_VALUE(ip) OVER(PARTITION BY id ORDER BY datetime) AS ip
FROM final_extract
ORDER BY LastLoginDateTime DESC
LIMIT 10;
Michael 的回答很好,但是如果您有很多行并且希望选择一些 rowa 并排除其余的,然后 QUALIFY option works very nicely, and using ROW_NUMBER 选择每组的首选行。
SELECT *
FROM VALUES
(111, '2022-02-03 11:37:58:000', '62.44.134.97'),
(222, '2021-02-03 11:37:58:000', '88.44.134.96'),
(111, '2022-02-01 11:37:58:000', '22.44.134.97'),
(111, '2021-02-03 11:37:58:000', '69.44.134.97')
v(id, datetime, ip_address)
QUALIFY row_number() over(partition by id order by datetime desc) = 1
因此为您 table 和专栏:
select id, datetime AS lastlogindatetime, "ip "
from final_extract
QUALIFY row_number() over ( partition by id order by datetime desc) = 1
order by 2 DESC
limit 10
比较简洁。