英文:
Is there a way to get NTH_VALUE with a variable N? (SQL - BigQuery)
问题
Here's the translation for the content you provided:
使用以下格式的BigQuery表格:
{ "name": "parent_id", "type": "STRING", "mode": "REQUIRED"},
{ "name": "parent_x", "type": "INTEGER", "mode": "REQUIRED"},
{ "name": "thing_id", "type": "STRING", "mode": "REQUIRED"},
{ "name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE"}
假设每个“thing_id”都有一个关联的“created_at”时间戳。
我想要获取每个父级ID的第N个“created_at”,其中第N个“thing_id”在我的表中注册。
我可以使用NTH_VALUE()函数,但我希望我的N是基于parent_x的可变值,更具体地说,我希望MIN("字面整数", parent_x)等于N。问题在于NTH_VALUE()只接受字面值或查询参数。
我该如何解决这个问题?
我要获取的结果表格如下:
{ "name": "parent_id", "type": "STRING", "mode": "REQUIRED"},
{ "name": "nth_created_at", "type": "TIMESTAMP", "mode": "NULLABLE"}
英文:
With a Bigquery table as such:
{"name": "parent_id", "type": "STRING", "mode": "REQUIRED"},
{"name": "parent_x", "type": "INTEGER", "mode": "REQUIRED"},
{"name": "thing_id", "type": "STRING", "mode": "REQUIRED"},
{"name": "created_at", "type": "TIMESTAMP", "mode": "NULLABLE"}
Assuming we have one row per "thing_id" with an associated "created_at"
I'm trying to fetch, for each parent id, the Nth "created_at" where the Nth "thing_id" is registered in my table.
I can use NTH_VALUE() but I want my N to be variable based on parent_x, more specifically I want the MIN("literal integer", parent_x) to be N. The problem is that NTH_VALUE() only accepts a literal or query parameter.
How could I get around this?
The result table I'm looking for is:
{"name": "parent_id", "type": "STRING", "mode": "REQUIRED"},
{"name": "nth_created_at", "type": "TIMESTAMP", "mode": "NULLABLE"}
答案1
得分: 1
你可以使用 row_number() 和窗口函数 min(),如下所示:
select parent_id, created_at nth_created_at
from (
    select 
        t.*,
        row_number() over(partition by parent_id order by created_at) rn,
        min(parent_x) over(partition by parent_id) tn
    from mytable t
) t
where rn = tn
英文:
You could use row_number() and a window min() as follows:
select parent_id, created_at nth_created_at
from (
	select 
		t.*,
		row_number() over(partition by parent_id order by created_at) rn,
        min(parent_x) over(partition by parent_id) tn
	from mytable t
) t
where rn = tn
答案2
得分: 0
最简单的方法可能是使用 row_number() 函数:
select t.* except (seqnum)
from (select t.*, row_number() over (partition by parent_x order by timestamp) as seqnum
      from t
     ) t
where seqnum = 1;
英文:
The simplest method is probably row_number():
select t.* except (seqnum)
from (select t.*, row_number() over (partition by parent_x order by timestamp) as seqnum
      from t
     ) t
where seqnum = 1;
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论