如何在 bigquery 中使用 rowid 按日期获取数据集的第一个值,并将给定日期的所有其他值设为 0
Posted
技术标签:
【中文标题】如何在 bigquery 中使用 rowid 按日期获取数据集的第一个值,并将给定日期的所有其他值设为 0【英文标题】:how can you use rowid in bigquery to get the first value of your dataset by date and put all other values as 0 for a given day 【发布时间】:2020-10-12 09:57:21 【问题描述】:我有一个 3 列的数据集;日期、销售额和 new_sales。
我在 bigquery 中尝试做的是针对给定日期,获取第一个销售值并将其填充到一个名为 new_sales 的新列中,同时将该给定日期的剩余天数保留为 0。
我将如何在 bigquery 中创建此查询?
【问题讨论】:
没有“第一”值。 SQL 表代表 无序 集,您的行似乎完全重复。排序仅由数据中的列确定。 【参考方案1】:您可以使用row_number()
- 但您需要一个定义具有相同date
的行的顺序的列 - 我假设id
:
select t.*,
case when row_number() over(partition by date order by id) = 1 then sales end as new_sales
from mytable t
【讨论】:
谢谢你,我将如何创建一个列来定义具有相同日期的行的顺序? @SuhaybDar:你的表的主键是什么?【参考方案2】:这是我之前做的一个例子 - 它应该适合你:
http://sqlfiddle.com/#!17/5c48e/8/0
虽然此答案假设您的销售价值在日期上保持一致并且不会改变,但如果它们确实发生了变化,例如12/10/2020 有两个不同的日期,您需要按日期订购。
我的代码如下:
CREATE TABLE links (
date_item varchar(255),
sales INT
);
INSERT INTO links (date_item, sales)
VALUES('12/10/2020',5),
('12/10/2020',5),
('12/10/2020',5),
('13/10/2020',7),
('13/10/2020',7),
('13/10/2020',7),
('13/10/2020',7),
('13/10/2020',7),
('13/10/2020',7),
('13/10/2020',7),
('14/10/2020',3),
('14/10/2020',3),
('14/10/2020',3);
select t.*,
case when ROW_NUMBER () OVER (partition BY date_item) =1 then sales else 0 end as new_sales
from links as t
【讨论】:
以上是关于如何在 bigquery 中使用 rowid 按日期获取数据集的第一个值,并将给定日期的所有其他值设为 0的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ROW_NUMBER() 在 SELECT 中获取增量“RowId”列
如何使用 ROWID 在 Python SQLite3 中编辑特定行的内容