使用SQL语句分组去重汇总

在用SQL获取数据库信息进行计算处理时,发现同一日期(天)内同一ID存在相同的记录(行),需要去掉同一日期内同一ID的相同行,仅保留其中一行即可,根据日期以此类推,最终提取一段时间内每天无同一ID重复的数据记录,怎么用SQL语句表现?如图说明。谢谢!

图1

img


图2

img

可以使用窗口函数和子查询来实现。
假设表格名为table_name,日期列为date_column,ID列为id_column,其他需要保留的列为column1和column2,需要提取的时间段为从start_date到end_date。
基本思路如下:

  • 根据日期和ID分组,使用窗口函数ROW_NUMBER()为每个组的行排名。
  • 在子查询中,以日期和ID作为关键字,选择排名为1的行,即去掉同一日期内同一ID的相同行。
  • 在主查询中,选择日期在时间段内且ID对应的行的排名为1的行,即每天无同一ID重复的数据记录。

SQL语句如下:

SELECT date_column, id_column, column1, column2
FROM (
  SELECT date_column, id_column, column1, column2,
         ROW_NUMBER() OVER (PARTITION BY date_column, id_column ORDER BY date_column) AS row_num
  FROM table_name
  WHERE date_column BETWEEN start_date AND end_date
) subquery
WHERE row_num = 1

使用row_number辅助进行清洗,然后对主键设置约束

该回答引用GPTᴼᴾᴱᴺᴬᴵ
可以使用SQL中的GROUP BY和聚合函数来实现分组去重汇总的操作。

假设表名为table,包含以下字段:date、id、value,其中date为日期,id为唯一标识符,value为记录的值。

要提取一段时间内每天无同一ID重复的数据记录,可以按日期和ID进行分组,并用聚合函数(如SUM、AVG、COUNT等)对value字段进行计算,然后筛选出每天仅出现一次的ID记录即可。

具体的SQL语句如下:

SELECT date, id, SUM(value) as sum_value
FROM table
WHERE date BETWEEN 'start_date' AND 'end_date'
GROUP BY date, id
HAVING COUNT(*) = 1


其中,start_date和end_date为需要查询的时间段起止日期,可以替换为具体的日期值。
·
上述SQL语句首先根据日期和ID进行分组,然后用SUM函数计算每个ID在每天的value总和,最后筛选出每天仅出现一次的ID记录。如果需要计算其他聚合函数,可以将SUM替换为对应的函数名即可。

了解下窗口函数,通过窗口函数可以处理

如果你的表里面重复的数据,每个字段都相同,直接用下面的语句就可以:
select distinct * from xxx;

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^