如何从两个SQL表提取唯一ID合并为一列并统计各产品最早销售日期
问题原因
你写的SQL存在多处语法和逻辑错误,missing at EOF报错的直接原因是FROM后的子查询没有指定别名,除此之外还有几个核心问题:
- 你在子查询内部给表起的别名
a、b仅在子查询范围内生效,外层SELECT直接引用a.sales_date、b.sales_date属于无效引用,外层访问不到这两个字段 - 子查询仅返回了
Member_ID字段,没有任何销售日期字段,无法做最小值计算 - 外层聚合查询没有加
GROUP BY Member_ID,不符合聚合查询的语法规范
正确写法
推荐使用UNION ALL+条件聚合的写法,逻辑清晰兼容性好,性能也优于多表关联:
CREATE TABLE merged_table AS SELECT Member_ID, MIN(CASE WHEN Product = 'A' THEN Sales_Date END) AS Product_A_earliest_date, MIN(CASE WHEN Product = 'B' THEN Sales_Date END) AS Product_B_earliest_date FROM ( -- 合并两张表的所有销售记录,不需要去重,聚合时会自动处理 SELECT Member_ID, Product, Sales_Date FROM Table_1 UNION ALL SELECT Member_ID, Product, Sales_Date FROM Table_2 ) AS all_sales_records GROUP BY Member_ID;
如果你的两张表确实分别固定存储A、B两类产品的记录,也可以用全外关联的写法:
CREATE TABLE merged_table AS SELECT COALESCE(a.Member_ID, b.Member_ID) AS Member_ID, a.min_a_date AS Product_A_earliest_date, b.min_b_date AS Product_B_earliest_date FROM ( -- 先计算每个ID的A产品最早购买日期 SELECT Member_ID, MIN(Sales_Date) AS min_a_date FROM Table_1 GROUP BY Member_ID ) a FULL OUTER JOIN ( -- 再计算每个ID的B产品最早购买日期 SELECT Member_ID, MIN(Sales_Date) AS min_b_date FROM Table_2 GROUP BY Member_ID ) b ON a.Member_ID = b.Member_ID;
补充说明
你没有错误使用UNION,只是UNION的用法不符合你当前的需求场景:UNION的作用是对两个结果集进行去重合并,你当前需求只需要合并所有记录后分组计算即可,用不需要去重的UNION ALL性能更高。
内容的提问来源于stack exchange,提问作者brightman1309
相关产品推荐
相关产品推荐

