- 【TiDB 版本】:v4.0.5
- 【问题描述】:
执行如下SQL时
SELECT count(distinct CASE WHEN IS_ARRIVED = 1 THEN BUYER_NICK ELSE NULL END) AS BUYER_NICK FROM marketing_summary WHERE (STORE_ID = ‘xxxx’ AND DISPATCH_TIMESTAMP >= ‘2020-09-22 00:00:00.0’ AND DISPATCH_TIMESTAMP <= ‘2020-09-25 23:59:59.0’);
若时间在同一分区中可顺利执行,若跨多个时间分区则会报如下错误:
ERROR 1105 (HY000): Can’t find column Column#29 in schema Column: [tb_lxk.marketing_summary.store_id,tb_lxk.marketing_summary.buyer_nick,tb_lxk.marketing_summary.dispatch_timestamp,tb_lxk.marketing_summary.is_arrived] Unique key:
把表的时间分区去掉执行不会报错
把 distinct 去掉 count(case when … )不会报错
count(distinct buyer_nick) 也不会报错
表结构如下:
CREATE TABLE
marketing_summary
(
biz_id
varchar(128) NOT NULL,
store_id
varchar(16000) NOT NULL,
store_name
varchar(16000) DEFAULT NULL,
domain
varchar(16000) DEFAULT NULL COMMENT ‘’,
buyer_nick
varchar(16000) NOT NULL,
trigger_timestamp
timestamp NOT NULL,
dispatch_timestamp
timestamp NOT NULL,
assistant_nick
varchar(16000) NOT NULL,
task_id
int(11) NOT NULL,
scenario
varchar(16000) NOT NULL COMMENT ‘’,
template_id
int(11) NOT NULL,
channel
varchar(16000) NOT NULL COMMENT ‘’,
mobile
varchar(16000) DEFAULT NULL COMMENT ‘’,
msg_count
int(11) DEFAULT NULL COMMENT ‘’,
created_trade_ids
varchar(16000) DEFAULT NULL COMMENT ‘’,
paid_trade_ids
varchar(16000) DEFAULT NULL COMMENT ‘’,
created_trade_count
int(11) DEFAULT NULL COMMENT ‘’,
created_order_count
int(11) DEFAULT NULL COMMENT ‘’,
created_amount_cent
bigint(12) DEFAULT NULL COMMENT ‘’,
paid_trade_count
int(11) DEFAULT NULL COMMENT ‘’,
paid_order_count
int(11) DEFAULT NULL COMMENT ‘’,
paid_amount_cent
bigint(12) DEFAULT NULL COMMENT ‘’,
replied_timestamp
timestamp NULL DEFAULT NULL COMMENT ‘’,
is_arrived
tinyint(1) NOT NULL COMMENT ‘’,
is_replied
tinyint(1) NOT NULL COMMENT ‘’,
is_converted
tinyint(1) NOT NULL COMMENT ‘’,
PRIMARY KEY (biz_id
,dispatch_timestamp
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE ( UNIX_TIMESTAMP(dispatch_timestamp
) ) (
PARTITIONdt_0
VALUES LESS THAN (0),
PARTITIONdt_20200924
VALUES LESS THAN (1600963200),
PARTITIONdt_20200925
VALUES LESS THAN (1601049600),
PARTITIONdt_20200926
VALUES LESS THAN (1601136000)
)