【mysql】如何求滞销天数?
mysql 如何 天数
2023-09-27 14:29:25 时间
如何求滞销天数?
1.基础表
-- kwan.test_table definition
CREATE TABLE `test_table` (
`id` int DEFAULT NULL COMMENT '日期',
`flag` int DEFAULT NULL COMMENT '销量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='店铺信息表';
INSERT INTO kwan.test_table (id, flag) VALUES(1, 1);
INSERT INTO kwan.test_table (id, flag) VALUES(2, 0);
INSERT INTO kwan.test_table (id, flag) VALUES(3, 0);
INSERT INTO kwan.test_table (id, flag) VALUES(4, 1);
INSERT INTO kwan.test_table (id, flag) VALUES(5, 0);
INSERT INTO kwan.test_table (id, flag) VALUES(6, 0);
INSERT INTO kwan.test_table (id, flag) VALUES(7, 0);
INSERT INTO kwan.test_table (id, flag) VALUES(8, 1);
INSERT INTO kwan.test_table (id, flag) VALUES(9, 1);
2.解法
解法1
SELECT id AS id
, flag AS flag
, flag1 AS flag1
, flag2 AS flag2
, IF(ZX > 99999, 0, ZX) AS ZX
FROM (
SELECT id AS id
, flag AS flag
, flag1 AS flag1
, flag2 AS flag2
, SUM(flag1)
OVER (PARTITION BY flag2, flag1 ORDER BY id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS ZX -- flag1的累加值即为连续值,因为分组
FROM (
SELECT id AS id
, flag AS flag
, flag1 AS flag1
, MAX(flag1)
OVER (ORDER BY id ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS flag2 -- 到当前行的最大值
FROM (
SELECT id AS id
, flag AS flag
, IF(flag > 0, 99999 + ROW_NUMBER() OVER (ORDER BY id), 1) AS flag1 -- 无售卖就为1,有售卖设置一个特别大的值
FROM kwan.test_table
) t
ORDER BY id ASC
) t
) t
ORDER BY id;
解法2:
SELECT *
FROM (
SELECT n1.id, n1.flag
FROM (
SELECT id, (CASE flag WHEN 1 THEN 0 ELSE 1 END) AS flag
FROM test_table
WHERE flag = 1) n1
UNION ALL
SELECT n2.id, n2.flag
FROM (
SELECT m2.id
, m2.flag
, row_number() over(partition BY m2.id ORDER BY m2.flag ASC) AS order_no
FROM (
SELECT t1.id, (t1.order_no - t2.order_no) AS flag
FROM (
SELECT id
, (CASE flag WHEN 1 THEN 0 ELSE 1 END) AS flag
, row_number() over(ORDER BY id) AS order_no
FROM test_table
) t1
LEFT JOIN
(
SELECT id
, flag
, row_number() over( ORDER BY id) AS order_no
FROM test_table
) t2 ON t1.flag = t2.flag
WHERE t1.flag = 1
AND t1.order_no > t2.order_no
) m2
) n2
WHERE n2.order_no = 1
order by id
) n
ORDER BY n.id
解法3:最佳
SELECT t2.product_key AS product_key --sku
, t2.gender_name AS gender_name --性别
, t2.category_name1 AS category_name1 --类别
, t2.brand_detail_no AS brand_detail_no --品牌
, t2.period_sdate AS period_sdate --日期
, t2.managing_city_no AS managing_city_no --城市
, t2.store_key AS store_key --店铺
, t2.un_sal_flag AS un_sal_flag --销售标识
, t2.rn - t2.rn_flag AS un_sal_day --滞销天数
FROM (
SELECT t1.product_key AS product_key --sku
, t1.gender_name AS gender_name --性别
, t1.category_name1 AS category_name1 --类别
, t1.brand_detail_no AS brand_detail_no --品牌
, t1.period_sdate AS period_sdate --日期
, t1.managing_city_no AS managing_city_no --城市
, t1.store_key AS store_key --店铺
, t1.un_sal_flag AS un_sal_flag --售卖标识
, t1.rn AS rn --行序号
, MAX(t1.rn_flag) OVER (PARTITION BY t1.product_key,t1.store_key ORDER BY t1.period_sdate) AS rn_flag --当前行有售卖的最大记录行号
FROM (
SELECT product_key AS product_key --sku
, gender_name AS gender_name --性别
, category_name1 AS category_name1 --类别
, brand_detail_no AS brand_detail_no --品牌
, period_sdate AS period_sdate --日期
, managing_city_no AS managing_city_no --城市
, store_key AS store_key --店铺
, un_sal_flag AS un_sal_flag --销售标识
, IF(un_sal_flag > 0, ROW_NUMBER() OVER (PARTITION BY product_key,store_key ORDER BY period_sdate ), 0) AS rn_flag -- 对有销售的排序,无销售的为0
, ROW_NUMBER() OVER (PARTITION BY product_key,store_key ORDER BY period_sdate ) AS rn
FROM ads_sense_rep.tmp_common_category_overview_17
) t1
) t2 distribute BY period_sdate,CAST(rand()*50 AS INT)
;
相关文章
- MySQL 数据库主从复制架构
- mysql存储引擎
- mysql中如何开启binlog?开启二进制日志文件?binary log?
- mysql中如何查看某个日期所在的周一是几号?某个日期所在的一周开始时间是几号?
- mysql中如何删除表上的索引?删除索引?
- mysql中显示当前数据库下的所有表,包括视图。
- mysql 经常使用命令整理总结
- MySQL 大表如何优化查询效率?
- MySQL 时间类型 datetime、bigint、timestamp,选哪个?
- MySQL集群节点宕机,数据库脑裂!如何排障?
- 《MySQL DBA修炼之道》——1.6 存储引擎简介
- Linux有问必答:如何通过命令行创建和设置一个MySQL用户
- MySQL update使用select的结果
- 面试题:MySQL的原子性和持久性如何保证?
- EF6+MYSQL之初体验
- mysql函数扩展之UDF开发
- 在数据库繁忙时如何快速有效的关闭MySQL服务
- MySQL数据的查询注意
- mysql保留2位小数字段如何设置 浮点数
- Innodb中MySQL如何快速删除2T的大表
- 基于JSP+MySQL实现用户注册登录及短信发送功能【100010145】
- (MariaDB/MySQL)之DML(2):数据更新、删除
- 如何在 MySQL 中对选择查询获得的结果进行排序?
- MySQL如何定位并优化慢查询sql
- 如何解决机器重启后MySql服务跑不起来了1067,附解决过程
- mysql如何查看索引使用情况以及优化 - guols0612
- mysql分页查询时,如何正确的获取总数
- 如何解决mysql数据库8小时无连接自动关闭
- mysql ssl 2026_mysql ERROR 2026
- mysql主从同步某个表不一致,单表恢复
- mysql基础原理大全
- 如何使mysql生成.db文件
- 【转】MySQL查询缓存详解
- 设置如何远程连接mysql数据库
- 如何实现mysql的远程连接