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

Nhóm các bản ghi từng giờ hoặc từng ngày và lấp đầy khoảng trống bằng 0 hoặc null trong mysql

Tạo một cột đơn dates_hours bảng chứa tất cả ngày và giờ trong một phạm vi hợp lý (ví dụ:từ 1900 đến 2200). Sau đó thực hiện LEFT JOIN từ bảng này đến truy vấn hiện tại của bạn.

Để kỹ thuật này hoạt động chính xác, có thể bạn sẽ cần thêm một cột được lập chỉ mục vào bảng của mình có chứa dấu thời gian đã chuyển đổi (copied_timestamp của bạn được chuyển đổi thành DATETIME , làm tròn đến giờ)

SELECT date_hour, count(req.converted_timestamp)
FROM
    dates_hours 
    LEFT JOIN req ON req.converted_timestamp = dates_hours.date_hour
WHERE date_hour
    BETWEEN (SELECT MIN(req.converted_timestamp) FROM req)
    AND (SELECT MAX(req.converted_timestamp) FROM req)
GROUP BY date_hour

Để tạo dates_hours bảng:

CREATE TABLE dates_hours (date_hour DATETIME PRIMARY KEY);

DELIMITER $$$
CREATE PROCEDURE generate_dates_hours (to_date DATETIME)
BEGIN

    DECLARE start_date DATETIME;
    DECLARE inc INT;

    SELECT MAX(date_hour) INTO start_date FROM dates_hours;
    IF start_date IS NULL THEN
        SET start_date = '1900-01-01';
    END IF;
    SET inc = 1;
    WHILE start_date + INTERVAL inc HOUR  <= to_date DO
        INSERT INTO dates_hours VALUE (start_date + INTERVAL inc HOUR);
        SET inc = inc +1;
    END WHILE;

END $$$
DELIMITER ;

CALL generate_dates_hours('2200-01-01');

Được rồi, bây giờ tôi đang tự đọc thử, tôi nhận ra rằng đây là một giải pháp khá xa vời. Tôi hy vọng ai đó nghĩ ra một cái thanh lịch hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xóa bản ghi trùng lặp khỏi bảng trong oracle

  2. Làm cách nào để lấy tên cột từ một bảng trong Oracle?

  3. CHỌN N hàng trên cùng mà không có ROWNUM?

  4. CHÈN 10 triệu truy vấn dưới 10 phút trong Oracle?

  5. Hợp nhất không tầm thường của hai bảng