Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Khoảng thời gian truy vấn MySQL và giá trị giảm tối đa so với giá trị tối đa trước đó

Tôi nghi ngờ chúng có thể được tối ưu hóa phần nào nhưng những truy vấn này sẽ mang lại cho bạn kết quả như mong muốn. Chúng chia sẻ cùng 3 CTE đầu tiên tạo ra diff_max giá trị cho mỗi data_max . Trong truy vấn đầu tiên, chúng tôi chỉ tìm kiếm sự thay đổi trong giá trị đó (từ NULL thành một giá trị hoặc giảm giá trị) để tạo các hàng đầu ra. CTE thứ 4 và thứ 5 của truy vấn thứ hai tương tự như truy vấn đầu tiên, nhưng chúng tôi thêm RANK đến diff_max giá trị, vì vậy chúng ta có thể JOIN giá trị tối thiểu (với ngày được kết hợp) cho date_diff_fromdate_diff_to giá trị từ CTE thứ 6 (giống với câu trả lời của tôi cho câu hỏi khác ).

Câu hỏi 1:

WITH cte AS (SELECT DATE(`date_time`) AS `date`,
                    `data`,
                    MAX(`data`) OVER (ORDER BY `date_time`) AS `data_max`
             FROM `test`),
cte2 AS (SELECT `date`,
                `data`,
                `data_max`,
                CASE WHEN `data` < `data_max` THEN `data` - `data_max` END AS `data_diff`
         FROM cte),
cte3 AS (SELECT `date`, 
                MIN(`data_diff`) OVER (PARTITION BY `data_max` ORDER BY `date`) AS `diff_max`
         FROM cte2),
cte4 AS (SELECT `date`, `diff_max`, LAG(`diff_max`) OVER (ORDER BY `date`) AS `old_diff_max`
         FROM cte3)
SELECT `date`, `diff_max`
FROM cte4
WHERE `diff_max` < `old_diff_max` OR `old_diff_max` IS NULL AND `diff_max` IS NOT NULL

Đầu ra:

date        diff_max
2017-01-04  -3
2017-01-09  -7
2017-01-11  -10
2017-01-13  -2

Câu hỏi 2:

WITH cte AS (SELECT DATE(`date_time`) AS `date`,
                    `data`,
                    MAX(`data`) OVER (ORDER BY `date_time`) AS `data_max`
             FROM `test`),
cte2 AS (SELECT `date`,
                `data`,
                `data_max`,
                CASE WHEN `data` < `data_max` THEN `data` - `data_max` END AS `data_diff`
         FROM cte),
cte3 AS (SELECT `data_max`, `date`, 
                MIN(`data_diff`) OVER (PARTITION BY `data_max` ORDER BY date) AS `diff_max`
         FROM cte2),
cte4 AS (SELECT `data_max`, `date`, `diff_max`, 
                LAG(`diff_max`) OVER (ORDER BY `date`) AS `old_diff_max`
         FROM cte3),
cte5 AS (SELECT `date`, `diff_max`, 
                RANK() OVER (PARTITION BY `data_max` ORDER BY `diff_max`) AS `diff_rank`
         FROM cte4
         WHERE `diff_max` < `old_diff_max` OR `old_diff_max` IS NULL AND `diff_max` IS NOT NULL),
cte6 AS (SELECT `data_max`, 
                MIN(CASE WHEN `data_diff` IS NOT NULL THEN date END) AS diff_date_from,
                MAX(CASE WHEN `data_diff` IS NOT NULL THEN date END) AS diff_date_to
         FROM cte2
         GROUP BY `data_max`
         HAVING diff_date_from IS NOT NULL)
SELECT diff_date_from, diff_date_to, `date` AS diff_max_date, `diff_max`
FROM cte6
JOIN cte5 ON cte5.date BETWEEN cte6.diff_date_from AND cte6.diff_date_to
WHERE cte5.diff_rank = 1

Đầu ra:

diff_date_from  diff_date_to    diff_max_date   diff_max
2017-01-04      2017-01-06      2017-01-04      -3
2017-01-09      2017-01-11      2017-01-11      -10
2017-01-13      2017-01-13      2017-01-13      -2

Demo trên dbfiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để sử dụng JdbcTemplate của Spring để kết nối với cơ sở dữ liệu MySql đơn giản?

  2. Tìm nạp dữ liệu từ Mysql DB sang listView bằng JSON và PHP

  3. Máy chủ gặp lỗi nội bộ hoặc định cấu hình sai và không thể hoàn thành yêu cầu của bạn

  4. Làm cách nào để tạo ứng dụng Android với cơ sở dữ liệu MySQL cục bộ?

  5. Tạo lại com.mysql.jdbc.exceptions.jdbc4.CommunicationsException với thiết lập Spring, hibernate và C3P0