pgcli "postgres://postgres:U1pm3f5SX34DXkHoW6aKFsBHOlMA9binDPNG4aT0FAcg7AubEvYm0e6kU2dZiYrR@stage.rahamafresh.com:5433/tracksolid_db"

postgresql://postgres:U1pm3f5SX34DXkHoW6aKFsBHOlMA9binDPNG4aT0FAcg7AubEvYm0e6kU2dZiYrR@timescale_db-bo3nov2ija7g8wn9b1g2paxs-104717464280:5432/tracksolid_db

---- CURRENT LIVE POSITIONS ------- All devices with a position in the last hour ----
SELECT
    d.device_name,
    d.mc_type,
    ROUND(lp.lat::numeric, 5)  AS lat,
    ROUND(lp.lng::numeric, 5)  AS lng,
    lp.speed,
    lp.acc_status,
    lp.gps_signal,
    lp.gps_num                 AS satellites,
    lp.gps_time AT TIME ZONE 'Africa/Nairobi' AS last_fix_eat,
    ROUND(EXTRACT(EPOCH FROM (now() - lp.gps_time)) / 60.0, 0) AS mins_ago
  FROM tracksolid.live_positions lp
  JOIN tracksolid.devices d ON d.imei = lp.imei
  WHERE lp.gps_time > now() - interval '1 hour'
  ORDER BY lp.gps_time DESC;

----- All 19 live positions — current snapshot ----

SELECT
  d.device_name,
  d.mc_type,
  ROUND(lp.lat::numeric, 5)   AS lat,
  ROUND(lp.lng::numeric, 5)   AS lng,
  lp.speed,
  lp.acc_status,
  lp.gps_time AT TIME ZONE 'Africa/Nairobi' AS last_fix_eat,
  ROUND(EXTRACT(EPOCH FROM (now() - lp.gps_time)) / 3600.0, 1) AS hours_ago,
  lp.current_mileage          AS odometer_km
FROM tracksolid.live_positions lp
JOIN tracksolid.devices d ON d.imei = lp.imei
ORDER BY lp.gps_time DESC;

-------- Devices with no position (silent fleet) -----

SELECT d.imei, d.device_name, d.mc_type, d.sim, d.expiration::date
FROM tracksolid.devices d
LEFT JOIN tracksolid.live_positions lp ON lp.imei = d.imei
WHERE lp.imei IS NULL
ORDER BY d.mc_type, d.device_name;

---- Vehicles currently moving (ACC on OR speed > 0)

SELECT
  d.device_name,
  lp.speed,
  lp.acc_status,
  lp.gps_time AT TIME ZONE 'Africa/Nairobi' AS last_fix_eat
FROM tracksolid.live_positions lp
JOIN tracksolid.devices d ON d.imei = lp.imei
WHERE lp.speed > 0 OR lp.acc_status = '1'
ORDER BY lp.speed DESC;

---- Vehicles in Uganda ----- 

SELECT
  d.device_name,
  ROUND(lp.lat::numeric, 4) AS lat,
  ROUND(lp.lng::numeric, 4) AS lng,
  lp.gps_time AT TIME ZONE 'Africa/Nairobi' AS last_fix_eat
FROM tracksolid.live_positions lp
JOIN tracksolid.devices d ON d.imei = lp.imei
WHERE lp.lat NOT BETWEEN -5.0 AND 5.0
   OR lp.lng NOT BETWEEN 33.9 AND 42.0;

---- Vehicles in Kenya ----- 

SELECT
  d.device_name,
  ROUND(lp.lat::numeric, 4) AS lat,
  ROUND(lp.lng::numeric, 4) AS lng,
  lp.gps_time AT TIME ZONE 'Africa/Nairobi' AS last_fix_eat
FROM tracksolid.live_positions lp
JOIN tracksolid.devices d ON d.imei = lp.imei
WHERE lp.lat  BETWEEN -5.0 AND 5.0
   OR lp.lng  BETWEEN 33.9 AND 42.0;


========== TRIPS AND MOVEMENT ====== 

SELECT
  d.device_name,
  d.vehicle_number,
  d.driver_name,
  COUNT(*)                                        AS trips,
  ROUND(SUM(t.distance_km)::numeric, 2)           AS total_km,
  ROUND(AVG(t.avg_speed_kmh)::numeric, 1)         AS avg_speed_kmh,
  MAX(t.max_speed_kmh)                            AS top_speed_kmh,
  ROUND(SUM(t.driving_time_s) / 3600.0, 2)       AS drive_hours,
  ROUND(SUM(t.idle_time_s) / 3600.0, 2)          AS idle_hours,
  MIN(t.start_time AT TIME ZONE 'Africa/Nairobi') AS day_start,
  MAX(t.end_time   AT TIME ZONE 'Africa/Nairobi') AS day_end
FROM tracksolid.trips t
JOIN tracksolid.devices d ON d.imei = t.imei
WHERE t.start_time >= CURRENT_DATE AT TIME ZONE 'Africa/Nairobi'
GROUP BY d.device_name, d.vehicle_number, d.driver_name
ORDER BY total_km DESC;

------ trips summary LAST 24 HOURS per vehicle  -------

SELECT
    d.device_name,
    t.start_time AT TIME ZONE 'Africa/Nairobi' AS start_eat,
    t.end_time   AT TIME ZONE 'Africa/Nairobi' AS end_eat,
    ROUND(t.distance_km::numeric / 1000.0, 2)   AS distance_km,
    t.avg_speed_kmh,
    t.max_speed_kmh,
    ROUND(t.driving_time_s / 60.0, 0)           AS drive_mins,
    ROUND(t.idle_time_s    / 60.0, 0)           AS idle_mins,
    t.source
  FROM tracksolid.trips t
  JOIN tracksolid.devices d ON d.imei = t.imei
  WHERE t.start_time > now() - interval '24 hours'
  ORDER BY t.start_time DESC;

------- Fleet utilisation rate per vehicle (today)

SELECT
    d.device_name,
    d.driver_name,
    ROUND(SUM(t.driving_time_s) / 3600.0, 2) AS drive_hours,
    ROUND(SUM(t.idle_time_s)    / 3600.0, 2) AS idle_hours,
    LEAST(ROUND(SUM(t.driving_time_s + COALESCE(t.idle_time_s, 0)) / (12.0 * 3600) * 100, 1), 100) AS utilisation_pct
  FROM tracksolid.trips t
  JOIN tracksolid.devices d ON d.imei = t.imei
  WHERE t.start_time >= CURRENT_DATE AT TIME ZONE 'Africa/Nairobi'
  GROUP BY d.device_name, d.driver_name
  ORDER BY utilisation_pct DESC;

 KDK 829A GP           |             |        1.87 |            |            15.5
 FRED KMGW 538W HULETI |             |        1.65 |            |            13.7
 X3-63282              |             |        1.25 |            |            10.4

-----Tracking to this point of the day ----

 SELECT
    d.device_name,
    d.driver_name,
    ROUND(SUM(t.driving_time_s) / 3600.0, 2)                        AS drive_hours,
    ROUND(SUM(t.idle_time_s)    / 3600.0, 2)                        AS idle_hours,
    LEAST(ROUND(
      SUM(t.driving_time_s + COALESCE(t.idle_time_s, 0))
      / (EXTRACT(EPOCH FROM (
          LEAST(now(), CURRENT_DATE::timestamp AT TIME ZONE 'Africa/Nairobi' + interval '19 hours 30 minutes')
          - (CURRENT_DATE::timestamp AT TIME ZONE 'Africa/Nairobi' + interval '7 hours 30 minutes')
      ))) * 100
    , 1), 100)                                                       AS utilisation_pct_so_far
  FROM tracksolid.trips t
  JOIN tracksolid.devices d ON d.imei = t.imei
  WHERE t.start_time >= (CURRENT_DATE::timestamp AT TIME ZONE 'Africa/Nairobi' + interval '7 hours 30 minutes')
  GROUP BY d.device_name, d.driver_name
  ORDER BY utilisation_pct_so_far DESC;


  ------ Vehicles that have not moved today -------

SELECT d.device_name, d.mc_type, d.driver_name
FROM tracksolid.devices d
LEFT JOIN tracksolid.trips t
  ON t.imei = d.imei
  AND t.start_time >= CURRENT_DATE AT TIME ZONE 'Africa/Nairobi'
WHERE t.imei IS NULL
ORDER BY d.device_name;

------ Distance per driver — last 30 days

SELECT
    d.device_name,
    d.driver_name,
    COUNT(DISTINCT DATE(t.start_time AT TIME ZONE 'Africa/Nairobi')) AS active_days,
    COUNT(*)                                                           AS total_trips,
    ROUND(SUM(t.distance_km / 1000.0)::numeric, 0)                   AS total_km,
    ROUND(AVG(t.distance_km / 1000.0)::numeric, 1)                   AS avg_km_per_trip,
    MAX(t.max_speed_kmh)                                              AS top_speed_ever
  FROM tracksolid.trips t
  JOIN tracksolid.devices d ON d.imei = t.imei
  WHERE t.start_time > now() - interval '30 days'
  GROUP BY d.device_name, d.driver_name
  ORDER BY total_km DESC;


  ====== ALL ALARMS =====

  ----Alarms in 24 hours ----

  SELECT
  d.device_name,
  a.alarm_type,
  a.alarm_name,
  a.alarm_time AT TIME ZONE 'Africa/Nairobi' AS alarm_time_eat,
  ROUND(a.lat::numeric, 5)                   AS lat,
  ROUND(a.lng::numeric, 5)                   AS lng,
  a.speed,
  a.severity,
  a.acknowledged_at
FROM tracksolid.alarms a
JOIN tracksolid.devices d ON d.imei = a.imei
WHERE a.alarm_time > now() - interval '24 hours'
ORDER BY a.alarm_time DESC;

----Alarms in 7 Days ----
SELECT
  a.alarm_name,
  a.alarm_type,
  COUNT(*)                                         AS occurrences,
  COUNT(DISTINCT a.imei)                           AS devices_affected,
  MAX(a.alarm_time AT TIME ZONE 'Africa/Nairobi') AS last_seen_eat
FROM tracksolid.alarms a
WHERE a.alarm_time > now() - interval '7 days'
GROUP BY a.alarm_name, a.alarm_type
ORDER BY occurrences DESC;

------ unacknowledged alarms ------ 

SELECT
  d.device_name,
  a.alarm_name,
  a.alarm_time AT TIME ZONE 'Africa/Nairobi' AS alarm_time_eat,
  ROUND(EXTRACT(EPOCH FROM (now() - a.alarm_time)) / 3600.0, 1) AS hours_open
FROM tracksolid.alarms a
JOIN tracksolid.devices d ON d.imei = a.imei
WHERE a.acknowledged_at IS NULL
ORDER BY a.alarm_time DESC;

------ acknowledged alarms ------ 

UPDATE tracksolid.alarms
SET acknowledged_at = now(),
    acknowledged_by = 'operator_name'
WHERE id = <alarm_id>;

===========

------ Position history by source — counts ----

SELECT
  source,
  COUNT(*) AS fixes,
  MIN(gps_time AT TIME ZONE 'Africa/Nairobi') AS earliest,
  MAX(gps_time AT TIME ZONE 'Africa/Nairobi') AS latest
FROM tracksolid.position_history
GROUP BY source;

--------- Route replay for a specific vehicle — last 24 hours

device = name <'FRED KMGW 538W HULETI'> 

SELECT
  ph.gps_time AT TIME ZONE 'Africa/Nairobi' AS gps_time_eat,
  ROUND(ph.lat::numeric, 5)                 AS lat,
  ROUND(ph.lng::numeric, 5)                 AS lng,
  ph.speed,
  ph.direction,
  ph.acc_status,
  ph.source
FROM tracksolid.position_history ph
JOIN tracksolid.devices d ON d.imei = ph.imei
WHERE d.device_name = <'FRED KMGW 538W HULETI'>
  AND ph.gps_time > now() - interval '24 hours'
ORDER BY ph.gps_time ASC;


-------- Fix density per device — last 24 hours --------- 

SELECT
  d.device_name,
  COUNT(*)                                         AS total_fixes,
  COUNT(*) FILTER (WHERE ph.source = 'poll')       AS poll_fixes,
  COUNT(*) FILTER (WHERE ph.source = 'track_list') AS track_list_fixes,
  MIN(ph.gps_time AT TIME ZONE 'Africa/Nairobi')  AS first_fix,
  MAX(ph.gps_time AT TIME ZONE 'Africa/Nairobi')  AS last_fix
FROM tracksolid.position_history ph
JOIN tracksolid.devices d ON d.imei = ph.imei
WHERE ph.gps_time > now() - interval '24 hours'
GROUP BY d.device_name
ORDER BY total_fixes DESC;

### Device & Fleet Registry

-------- Full fleet — all 63 devices ------

SELECT
  device_name,
  mc_type,
  vehicle_number,
  driver_name,
  sim,
  ROUND(current_mileage_km::numeric, 0) AS odometer_km,
  expiration::date                       AS expires,
  enabled_flag
FROM tracksolid.devices
ORDER BY mc_type, device_name;

-------- Fleet by devices model ------

SELECT mc_type, COUNT(*) AS devices
FROM tracksolid.devices
GROUP BY mc_type ORDER BY devices DESC;


------ fleet by odometer readings ----- 

SELECT
  device_name,
  mc_type,
  sim,
  ROUND(current_mileage_km::numeric, 0) AS odometer_km,
  expiration::date                       AS expires
FROM tracksolid.devices
WHERE current_mileage_km IS NOT NULL AND current_mileage_km > 0
ORDER BY current_mileage_km DESC
LIMIT 15;

---- fleet blank driver sim vehicle number blanks ----

SELECT device_name, mc_type, sim
FROM tracksolid.devices
WHERE vehicle_number IS NULL OR vehicle_number = ''
   OR driver_name    IS NULL OR driver_name    = ''
ORDER BY mc_type, device_name;

----- fleet by expiry dates --- 

SELECT
  COUNT(*) FILTER (WHERE expiration IS NULL)                               AS no_expiry_set,
  COUNT(*) FILTER (WHERE expiration < now())                               AS already_expired,
  COUNT(*) FILTER (WHERE expiration BETWEEN now() AND now() + interval '90 days') AS expiring_90days,
  COUNT(*) FILTER (WHERE expiration > now() + interval '90 days')          AS valid_long_term
FROM tracksolid.devices;


-----no of rows in db ----- 

SELECT
  (SELECT COUNT(*) FROM tracksolid.devices)              AS devices,
  (SELECT COUNT(*) FROM tracksolid.live_positions)       AS live_positions,
  (SELECT COUNT(*) FROM tracksolid.position_history)     AS position_history,
  (SELECT COUNT(*) FROM tracksolid.trips)                AS trips,
  (SELECT COUNT(*) FROM tracksolid.alarms)               AS alarms,
  (SELECT COUNT(*) FROM tracksolid.parking_events)       AS parking_events,
  (SELECT COUNT(*) FROM tracksolid.obd_readings)         AS obd_readings,
  (SELECT COUNT(*) FROM tracksolid.device_events)        AS device_events,
  (SELECT COUNT(*) FROM tracksolid.fuel_readings)        AS fuel_readings,
  (SELECT COUNT(*) FROM tracksolid.temperature_readings) AS temperature_readings,
  (SELECT COUNT(*) FROM tracksolid.lbs_readings)         AS lbs_readings,
  (SELECT COUNT(*) FROM tracksolid.ingestion_log)        AS ingestion_log;

===== 

  SELECT 'devices'              AS table_name, COUNT(*) FROM tracksolid.devices
  UNION ALL
  SELECT 'live_positions',               COUNT(*) FROM tracksolid.live_positions
  UNION ALL
  SELECT 'position_history',             COUNT(*) FROM tracksolid.position_history
  UNION ALL
  SELECT 'trips',                        COUNT(*) FROM tracksolid.trips
  UNION ALL
  SELECT 'alarms',                       COUNT(*) FROM tracksolid.alarms
  UNION ALL
  SELECT 'parking_events',               COUNT(*) FROM tracksolid.parking_events
  UNION ALL
  SELECT 'obd_readings',                 COUNT(*) FROM tracksolid.obd_readings
  UNION ALL
  SELECT 'device_events',                COUNT(*) FROM tracksolid.device_events
  UNION ALL
  SELECT 'fuel_readings',                COUNT(*) FROM tracksolid.fuel_readings
  UNION ALL
  SELECT 'temperature_readings',         COUNT(*) FROM tracksolid.temperature_readings
  UNION ALL
  SELECT 'lbs_readings',                 COUNT(*) FROM tracksolid.lbs_readings
  UNION ALL
  SELECT 'ingestion_log',                COUNT(*) FROM tracksolid.ingestion_log
  ORDER BY table_name;