保留组中的第一条记录并在 SQL 中使用 Null/0 填充其余部分?

Posted

技术标签:

【中文标题】保留组中的第一条记录并在 SQL 中使用 Null/0 填充其余部分?【英文标题】:Keep first record in group and populate rest with Null/0 in SQL? 【发布时间】:2020-10-13 07:52:58 【问题描述】:

我的数据库中有下表:

       date sales
1  2010-12-13    10
2  2010-12-13    10
3  2010-12-13    10
4  2010-12-13    10
5  2010-12-13    10
6  2010-12-14    20
7  2010-12-14    20
8  2010-12-14    20
9  2010-12-14    20
10 2010-12-14    20

有没有办法只获得第一条记录,其余的用 NULL 或 0 填充组的其余部分?因为分组将按日期和销售额进行:

例如,预期的输出是:

         date sales
1  2010-12-13    10
2  2010-12-13    0
3  2010-12-13    0
4  2010-12-13    0
5  2010-12-13    0
6  2010-12-14    20
7  2010-12-14    0
8  2010-12-14    0
9  2010-12-14    0
10 2010-12-14    0

所以本质上是保留第一条记录,但使组中的其余记录为 0(如果更快/更容易,可能是 Null)

我最接近解决这个问题的方法是通过内部连接获得第一条记录 - 但我认为分区可能会解决它 - 只是现在卡住了!

任何帮助表示赞赏!

使用 SQLite - 我也可以使用 GCP (SQL)

【问题讨论】:

【参考方案1】:

这可能适用于 SQLite:

CASE WHEN id = MIN(id) OVER(PARTITION BY date) THEN sales ELSE 0 END as sales

如果没有,您可以准备一个每个日期只有最小 ID 的子查询并将其加入:

SELECT
   CASE WHEN y.id IS NULL THEN 0 ELSE sales END as sales
FROM
  x
  LEFT JOIN (SELECT MIN(id) as id FROM x GROUP BY date) y ON x.id= y.id

【讨论】:

是的 - 第一个解决方案工作正常 - 但我确实使用了:select *, CASE WHEN rowid = MIN(rowid) OVER(PARTITION BY date) THEN sales ELSE 0 END as new_sales from df 因为 Min(rowid) 是 SQLite 的原生! 啊,我以为 1,2,3,4.. 是你的递增 ID! 可能值得注意的是,SQLite 中的 ROWID 是一个自动递增的 int64,但并不总是前面的行具有较低的 ID。在某些情况下,SQLite 必须填写数量少于现有行的 ROWID,即使该行本身较晚。但是,它可能不会打扰您的情况;你仍然会得到 some 行,即 MIN,即使它不一定是最早的书面行.. 但无论如何你都无法分辨..

以上是关于保留组中的第一条记录并在 SQL 中使用 Null/0 填充其余部分?的主要内容,如果未能解决你的问题,请参考以下文章

怎么删除ACCESS中的重复记录 只保留一条

sql4

在Java语言中 我要删除存储在List<List>中的第一条数据应该怎么做?高手支个招谢谢!

如何用sql语句查询:在一个表中存在而另一个表中不存在的第一条记录?

如何取SQL结果集的第一条记录

SQL Server 仅更新组中的最新记录