-- Hourly Sorter Details Rate Query (Table Display)
-- Shows every hour in detail with all sorter statistics as rates (items per hour)
-- Rate calculation matches SorterDetails_Rate.sql formula

SELECT
    CONCAT(DATE(Startstamp), ' ', LPAD(HOUR(Startstamp), 2, '0'), ':00') AS Startstamp,
    CONCAT('H', TIMESTAMPDIFF(HOUR,
        DATE_FORMAT(Startstamp, "%Y-%m-%d %H:00:00"),
        DATE_FORMAT(NOW(), "%Y-%m-%d %H:00:00")
    )) AS Hour,
    CONCAT(ROUND(success_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS success_rate,
    CONCAT(ROUND(unknown_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS unknown_rate,
    CONCAT(ROUND(unexpected_container_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS unexpected_container_rate,
    CONCAT(ROUND(tracking_error_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS tracking_error_rate,
    CONCAT(ROUND(gap_error_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS gap_error_rate,
    CONCAT(ROUND(destination_full_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS destination_full_rate,
    CONCAT(ROUND(destination_non_operational_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS destination_non_operational_rate,
    CONCAT(ROUND(invalid_destination_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS invalid_destination_rate,
    CONCAT(ROUND(destination_disabled_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS destination_disabled_rate,
    CONCAT(ROUND(throughput_limit_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS throughput_limit_rate,
    CONCAT(ROUND(failed_to_divert_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS failed_to_divert_rate,
    CONCAT(ROUND(no_destination_received_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS no_destination_received_rate,
    CONCAT(ROUND(lost_container_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS lost_container_rate,
    CONCAT(ROUND(dimension_error_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS dimension_error_rate,
    CONCAT(ROUND(weight_error_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS weight_error_rate,
    CONCAT(ROUND(container_utilization_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS container_utilization_rate,
    CONCAT(ROUND(unable_to_divert_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS unable_to_divert_rate,
    CONCAT(ROUND(destination_not_attempted_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS destination_not_attempted_rate,
    CONCAT(ROUND(scan_error_count * 3600 / TIMESTAMPDIFF(SECOND, Startstamp, Endtstamp), 2), ' pph') AS scan_error_rate
FROM (
    SELECT
        DATE(t_stamp) AS date_part,
        HOUR(t_stamp) AS hour_part,
        MIN(t_stamp) AS Startstamp,
        MAX(t_stamp) AS Endtstamp,
        SUM(DivertStatus = 0) AS success_count,
        SUM(DivertStatus = 1) AS unknown_count,
        SUM(DivertStatus = 2) AS unexpected_container_count,
        SUM(DivertStatus = 3) AS tracking_error_count,
        SUM(DivertStatus = 4) AS gap_error_count,
        SUM(DivertStatus = 5) AS destination_full_count,
        SUM(DivertStatus = 6) AS destination_non_operational_count,
        SUM(DivertStatus = 7) AS invalid_destination_count,
        SUM(DivertStatus = 12) AS destination_disabled_count,
        SUM(DivertStatus = 13) AS throughput_limit_count,
        SUM(DivertStatus = 14) AS failed_to_divert_count,
        SUM(DivertStatus = 16) AS no_destination_received_count,
        SUM(DivertStatus = 17) AS lost_container_count,
        SUM(DivertStatus = 18) AS dimension_error_count,
        SUM(DivertStatus = 19) AS weight_error_count,
        SUM(DivertStatus = 20) AS container_utilization_count,
        SUM(DivertStatus = 21) AS unable_to_divert_count,
        SUM(DivertStatus = 22) AS destination_not_attempted_count,
        SUM(DivertStatus IN (8, 9, 10)) AS scan_error_count
    FROM alltable
    WHERE t_stamp BETWEEN :starttime AND :endtime
    GROUP BY DATE(t_stamp), HOUR(t_stamp)
) counts
ORDER BY Startstamp ASC;