【发布时间】:2020-09-03 18:35:57
【问题描述】:
CREATE TABLE operations (
id int auto_increment primary key,
time_stamp DATE,
product VARCHAR(255)
);
INSERT INTO operations
(time_stamp, product)
VALUES
("2020-01-01", "Product_A"),
("2020-01-01", "Product_B"),
("2020-01-01", "Product_C"),
("2020-01-01", "Product_D"),
("2020-03-15", "Product_A"),
("2020-03-15", "Product_C"),
("2020-03-15", "Product_E");
查询:
SELECT
time_stamp,
product,
(CASE
WHEN MAX(time_stamp) OVER (PARTITION BY product)
= MIN(time_stamp) OVER () THEN 'deleted'
WHEN MIN(time_stamp) OVER (PARTITION BY product)
= MAX(time_stamp) OVER () THEN 'new'
ELSE 'both' END) AS existing_type
FROM operations
GROUP BY time_stamp, product
ORDER BY product, time_stamp;
如果产品存在于both time-stamps 中,则使用上述查询我会检查表。
如果它仅存在于其中一个中,则将其分配给deleted 或new。
该查询在示例中运行快速且完美。
但是,当我将它应用到包含更多数据的原始数据库时,它的执行速度非常慢。
因此,我想知道是否有办法优化查询以使其在大量数据上也能快速运行?
【问题讨论】:
-
您的大表中是否只有 2 个时间戳值?
-
请再添加几行——包括一些“两种”情况。并指出“正确”的结果集。
标签: mysql sql query-optimization