uv 统计错误 sql group count(distinct if())

Bug 反馈
清晰准确地描述您发现的问题,提供任何可能复现问题的步骤有助于研发同学及时处理问题
【 Bug 的影响】
正常sql语法执行得到结果错误
【可能的问题复现步骤】
sql统计uv
【看到的非预期行为】
总uv比店铺uv小
【期望看到的行为】

【相关组件及具体版本】
tidb3.0
【其他背景信息或者截图】
如集群拓扑,系统和内核版本,应用 app 信息等;如果问题跟 SQL 有关,请提供 SQL 语句和相关表的 Schema 信息;如果节点日志存在关键报错,请提供相关节点的日志内容或文件;如果一些业务敏感信息不便提供,请留下联系方式,我们与您私下沟通。



会出现allcount大于scount


CREATE TABLE date_store_stat (
id bigint(20) NOT NULL AUTO_INCREMENT,
data_date varchar(16) NOT NULL COMMENT ‘日期’,
vid int(11) NOT NULL COMMENT ‘smr_visit的id’,
sid int(11) NOT NULL COMMENT ‘店铺ID’,
cid varchar(32) NOT NULL COMMENT ‘访问CID’,
pid int(11) DEFAULT NULL COMMENT ‘SkuID’,
gid int(11) DEFAULT NULL COMMENT ‘商品ID’,
gname varchar(365) DEFAULT NULL COMMENT ‘商品名称’,
region varchar(32) NOT NULL DEFAULT ‘其他’ COMMENT ‘省份’,
iscopy int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘是否为体面数据,0:真数据;1:体面数据’,
PRIMARY KEY (id),
KEY idx_dssi_data_date (data_date),
KEY idx_dssi_gid (gid),
KEY idx_dssi_iscopy (iscopy),
KEY idx_dssi_sid (sid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

查询sql:

SELECT a.data_date,a.sid,COUNT(DISTINCT a.cid) ‘allcount’,COUNT(DISTINCT IF(a.pid IS NULL,a.cid,NULL)) ‘scount’
FROM date_store_stat a WHERE a.data_date=‘2021-07-24’ GROUP BY a.sid ORDER BY a.data_date

SELECT a.data_date,a.sid,COUNT(DISTINCT a.cid) ‘allcount’,COUNT(DISTINCT IF(a.pid IS NULL,a.cid,NULL)) ‘scount’
FROM date_store_stat a
WHERE a.sid = 519162 AND a.data_date=‘2021-07-24’
GROUP BY a.data_date

3 个赞

看上面截图中的版本还是 3.0.0-alpha,使用最新的 5.1 版本测试还有类似问题么

我现在是线上出了问题了,升级是后期的事情了,确定这个是版本问题么?

可以把 WHERE a.sid = 519162 AND a.data_date=‘2021-07-24’ 这部分数据导入到 5.1.1 测试集群(tiup playground v5.1.1)对比下看看

另外也不建议关闭 only_full_group_by,在这种情况下可能会出现一些执行结果难以解释的现象

我把表和数据同步到了mysql 查询得到结果是358 我现在想的是能怎么解决问题,是确定是3.0版本的问题你还是我这边的tidb参数配置问题。

如果说确定是3.0不支持这种语法,那有什么好的替换语法么? 或者有哪儿能明确的查出哪些sql语法不被支持么?
only_full_group_by 怎么开启?

设置 sql mode:set sql_mode=‘only_full_group_by’,上面的查询 group by 试试带上 select 后面的所有字段 data_date 和 sid

本地快速启动测试集群可以参考 https://docs.pingcap.com/zh/tidb/v5.0/tiup-playground

image

image

这个改成 group by a.data_date,a.sid 查一下看看结果,不行的话再导入 5.1.1 本地测试集群

group by a.data_date,a.sid 也是不行的 上面有截图,就是不知道更改了sql_mode后行不行,我目前更改失败了 正在联系运维同学帮忙给权限

image

修改了sql_mode 后group by加上了所有字段还是不行

image

每次的不同 有点怀疑人生了。我开始以为是count(distinct if 这种结果导致的,可是现在测试看来好像并不是那么回事

看起来像这个https://github.com/pingcap/tidb/issues/17148(感觉还是需要 用高版本的测试一下)

1 个赞

没有办法解决了么? 我都找不到规律了,一点信任感都没有了,不知道什么样的语法得到的就是错误的数据

1 个赞

我们可以看看是否有绕过的方法,不过只有你有数据及环境,建议按照上面给的方式,试一下高版本是否还有该问题(需要确认和上面给的 issue 是同一个问题)

尝试换了好几种写法,甚至想逐条group by 结果越测心越凉,结果变来变去的,我都是把数据拷贝到mysql后同样的sql做对比才发现太不可控了,线上业务要紧,目前紧急关闭了UV展现,数据接口缓存只缓存一天的数据,所以我现在已经在迁库了,先迁移到mysql。等有时间了再测试新版本是否还存在同样问题。

1 个赞

这个肯定是产品bug,如果是和发的issue同一个问题,高版本已经修复了(看现象是一个问题),如果是其他问题,则需要我们研发同学重新想办法定位一下根因

我问一下这个bug的根因吧,看看有没有其他方式可以解决