我想要 table 的最新日期和价格,在大查询中该 ID 有多个不同日期的价格。下面是我的查询
I want the latest date and price from the table which has multiple prices with different date on that ID in big query. here is my query below
我面临的问题是我不想按价格列分组。我只想按 id 分组,这样我就可以获得最新的日期和价格。但是大查询不允许我 运行 这个查询没有按价格分组。
这是我的查询:
SELECT ID,
最大(创建日期)作为最新日期,
价格
来自 table name
按id分组
我有一个解决办法给你。它不是最干净的,但它可以工作。
SELECT id, "created date" as "latest date", price
FROM (SELECT id,
FIRST_VALUE("created date") OVER (PARTITION BY id ORDER BY "created date" DESC) as "created date",
FIRST_VALUE("price") OVER (PARTITION BY id ORDER BY "created date" DESC) as "price"
FROM "table name")
GROUP BY id
我觉得这个应该也可以
SELECT UNIQUE id,
FIRST_VALUE("created date") OVER (PARTITION BY id ORDER BY "created date" DESC) as "created date",
FIRST_VALUE("price") OVER (PARTITION BY id ORDER BY "created date" DESC) as "price"
FROM "table name"
使用以下方法
select as value
array_agg(t order by created_date desc limit 1)[offset(0)]
from your_table t
group by id
在这种情况下,我使用了聚合函数ARRAY_AGG,它returns 一个按日期排序的数组,每个ID 只获取一条记录。还,
我使用 OFFSET 命令从零位置读取数组。
WITH Example AS
(SELECT 1 as ID, 32.5 as price, PARSE_DATE("%x", "12/25/22") as sdate UNION ALL
SELECT 1 as ID, 3 as price, PARSE_DATE("%x",'01/13/22') as sdate UNION ALL
SELECT 2 as ID, 2.5 as price, PARSE_DATE("%x",'01/30/22') as sdate UNION ALL
SELECT 3 as ID, 5 as price, PARSE_DATE("%x",'01/20/22') as sdate UNION ALL
SELECT 4 as ID, 50 as price, PARSE_DATE("%x",'01/10/22') as sdate UNION ALL
SELECT 4 as ID, 1.13 as price, PARSE_DATE("%x",'01/08/22') as sdate UNION ALL
SELECT 5 as ID, 150 as price, PARSE_DATE("%x",'01/05/22') as sdate UNION ALL
SELECT 6 as ID, 30 as price, PARSE_DATE("%x",'01/05/22') as sdate UNION ALL
SELECT 7 as ID, 5.2 as price, PARSE_DATE("%x",'01/03/22') as sdate UNION ALL
SELECT 8 as ID, 200 as price, PARSE_DATE("%x",'02/01/22') as sdate
)
SELECT AS VALUE ARRAY_AGG(table ORDER BY sdate DESC LIMIT 1)[OFFSET(0)]
FROM Example table
group by id
我面临的问题是我不想按价格列分组。我只想按 id 分组,这样我就可以获得最新的日期和价格。但是大查询不允许我 运行 这个查询没有按价格分组。
这是我的查询:
SELECT ID,
最大(创建日期)作为最新日期,
价格
来自 table name
按id分组
我有一个解决办法给你。它不是最干净的,但它可以工作。
SELECT id, "created date" as "latest date", price
FROM (SELECT id,
FIRST_VALUE("created date") OVER (PARTITION BY id ORDER BY "created date" DESC) as "created date",
FIRST_VALUE("price") OVER (PARTITION BY id ORDER BY "created date" DESC) as "price"
FROM "table name")
GROUP BY id
我觉得这个应该也可以
SELECT UNIQUE id,
FIRST_VALUE("created date") OVER (PARTITION BY id ORDER BY "created date" DESC) as "created date",
FIRST_VALUE("price") OVER (PARTITION BY id ORDER BY "created date" DESC) as "price"
FROM "table name"
使用以下方法
select as value
array_agg(t order by created_date desc limit 1)[offset(0)]
from your_table t
group by id
在这种情况下,我使用了聚合函数ARRAY_AGG,它returns 一个按日期排序的数组,每个ID 只获取一条记录。还, 我使用 OFFSET 命令从零位置读取数组。
WITH Example AS
(SELECT 1 as ID, 32.5 as price, PARSE_DATE("%x", "12/25/22") as sdate UNION ALL
SELECT 1 as ID, 3 as price, PARSE_DATE("%x",'01/13/22') as sdate UNION ALL
SELECT 2 as ID, 2.5 as price, PARSE_DATE("%x",'01/30/22') as sdate UNION ALL
SELECT 3 as ID, 5 as price, PARSE_DATE("%x",'01/20/22') as sdate UNION ALL
SELECT 4 as ID, 50 as price, PARSE_DATE("%x",'01/10/22') as sdate UNION ALL
SELECT 4 as ID, 1.13 as price, PARSE_DATE("%x",'01/08/22') as sdate UNION ALL
SELECT 5 as ID, 150 as price, PARSE_DATE("%x",'01/05/22') as sdate UNION ALL
SELECT 6 as ID, 30 as price, PARSE_DATE("%x",'01/05/22') as sdate UNION ALL
SELECT 7 as ID, 5.2 as price, PARSE_DATE("%x",'01/03/22') as sdate UNION ALL
SELECT 8 as ID, 200 as price, PARSE_DATE("%x",'02/01/22') as sdate
)
SELECT AS VALUE ARRAY_AGG(table ORDER BY sdate DESC LIMIT 1)[OFFSET(0)]
FROM Example table
group by id