如何在 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 中编辑特定行的内容

使用 FORALL 和 RETURNING 插入表时如何获取 ROWID

使用DBMS_ROWID获取被阻塞行的rowid