{"id":231,"date":"2021-02-17T07:00:00","date_gmt":"2021-02-16T21:00:00","guid":{"rendered":"https:\/\/fernygroveweather.com\/blog\/?p=231"},"modified":"2021-02-17T21:11:50","modified_gmt":"2021-02-17T11:11:50","slug":"new-air-quality-statistics","status":"publish","type":"post","link":"https:\/\/fernygroveweather.com\/blog\/2021\/02\/17\/new-air-quality-statistics\/","title":{"rendered":"New air quality statistics"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The air quality data we recently began to measure has been expanded to include statistics for this month, this year and all-time. &nbsp;This data is now available on the <a rel=\"noreferrer noopener\" href=\"..\/..\/month-year.php\" data-type=\"URL\" data-id=\"..\/..\/month-year.php\" target=\"_blank\">this month and year<\/a> and <a rel=\"noreferrer noopener\" href=\"..\/..\/alltime-records.php\" data-type=\"URL\" data-id=\"..\/..\/alltime-records.php\" target=\"_blank\">all-time record<\/a> pages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the short period that we have been measuring air quality the air is exceptionally clean. For the vast majority of the time the particulates and air quality index values have been extremely low (good) and have been elevated to a slight degree only for fairly short periods of time.   <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To include these new statistics changes were required to be made to our database. Since the recording of air quality began from 26 December 2020, a routine is ran at the start of each day to fetch the data from the previous day to insert a new row into a database table for that day. However generally only the averages and maximums were shown, without the earliest time of the occurrence. With these improvements now the averages, minimum and maximums are measured for each day along with the time of minimums and maximums.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, it should noted that these additions began from 7 February 2021, because we only retain the real-time data for 7 days (for data storage reasons). Therefore the time of occurrence will not be shown for statistics before this date. Also we collecting a vast range of daily parameters, most of which haven&#8217;t been published to a great deal on the web site, but is being collected for completeness and for future analysis.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To provide a bit more information about how this works a MySQL database procedure (as shown below) is scheduled to run at the start of each day to insert the previous day data into a table of daily air quality averages and extremes. This uses the ROW_NUMBER window function to calculate the earliest time for each individual minimum and maximum for each day. A query for each of one of these calculations are then joined to a query that essentially merges these calculations into one table. Because these calculations are rather expensive a variable retrieves the latest date of data already inserted into the data to limit the quantity of data that is calculated to only the data not already captured in the daily table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These queries are both performed on the real-time table (every 10 seconds) and an 5 minute interval logged data table, with the results inserted into temporary tables. These two temporary tables are then used to determine the greatest value of each of these data sources to insert the data for each column of data. This is so that the data is suitably captured due any possible network outages that may affect the currency of data. The SQL COALESCE function is used to return the first non- null value from these data sources, with preference provided to the Real-time table.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><\/div>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><\/div>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:mysql decode:true \" title=\"SQL Procedure to populate daily air quality table\" >DELIMITER $$\nCREATE DEFINER=`root`@`localhost` PROCEDURE `PopulateDailyAirQual`()\n    COMMENT 'Procedure to populate daily air quality  '\nBEGIN\nDECLARE exit handler for SQLEXCEPTION\n \tBEGIN\n  \tGET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, \n   \t\t@errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;\n  \tSET @full_error = CONCAT(\"ERROR \", @errno, \" (\", @sqlstate, \"): \", @text);\n  \tSELECT @full_error;\nEND;\n\n    \nSET time_zone=\"+10:00\";\n\n-- determine the most recent data already inserted into table\nSET @lastUpdated = (select DATE(LogDate) FROM DailyAirQual ORDER BY LogDate DESC LIMIT 1);\n \n-- values from realtime table   \nDROP TEMPORARY TABLE IF EXISTS rtData;\nCREATE TEMPORARY TABLE IF NOT EXISTS rtData (\nLogDateRT DATE NOT NULL,          \nOutPm1_avgRT DECIMAL (5,1) NULL,          \nOutPm1_minRT DECIMAL (5,1) NULL,            \nOutTPm1_minRT TIME NULL,         \nOutPm1_maxRT DECIMAL (5,1) NULL,           \nOutTPm1_maxRT TIME NULL,       \nOutPm2p5_avgRT DECIMAL (5,1) NULL,         \nOutPm2p5_minRT DECIMAL (5,1) NULL,        \nOutTPm2p5_minRT TIME NULL,       \nOutPm2p5_maxRT DECIMAL (5,1) NULL,        \nOutTPm2p5_maxRT TIME NULL,     \nOutPm2p5_1hr_avgRT DECIMAL (5,1) NULL,     \nOutPm2p5_1hr_minRT DECIMAL (5,1) NULL,    \nOutTpm2p5_1hr_minRT TIME NULL,  \nOutPm2p5_1hr_maxRT DECIMAL (5,1) NULL,    \nOutTpm2p5_1hr_maxRT TIME NULL,  \nOutPm2p5_3hr_avgRT DECIMAL (5,1) NULL,    \nOutPm2p5_3hr_minRT DECIMAL (5,1) NULL,    \nOutTpm2p5_3hr_minRT TIME NULL,\nOutPm2p5_3hr_maxRT DECIMAL (5,1) NULL,    \nOutTpm2p5_3hr_maxRT TIME NULL,  \nOutPm2p5_24hr_avgRT DECIMAL (5,1) NULL,   \nOutPm2p5_24hr_minRT DECIMAL (5,1) NULL,    \nOutTpm2p5_24hr_minRT TIME NULL,  \nOutPm2p5_24hr_maxRT DECIMAL (5,1) NULL,    \nOutTpm2p5_24hr_maxRT TIME NULL, \nOutPm10_avgRT DECIMAL (5,1) NULL,           \nOutPm10_minRT DECIMAL (5,1) NULL,          \nOutTPm10_minRT TIME NULL,   \nOutPm10_maxRT DECIMAL (5,1) NULL,         \nOutTPm10_maxRT TIME NULL,      \nOutPm10_1hr_avgRT DECIMAL (5,1) NULL,    \nOutPm10_1hr_minRT DECIMAL (5,1) NULL,   \nOutTpm10_1hr_minRT TIME NULL,  \nOutPm10_1hr_maxRT DECIMAL (5,1) NULL,      \nOutTpm10_1hr_maxRT TIME NULL,   \nOutPm10_3hr_avgRT DECIMAL (5,1) NULL,     \nOutPm10_3hr_minRT DECIMAL (5,1) NULL,     \nOutTpm10_3hr_minRT TIME NULL,   \nOutPm10_3hr_maxRT DECIMAL (5,1) NULL,     \nOutTpm10_3hr_maxRT TIME NULL,    \nOutPm10_24hr_avgRT DECIMAL (5,1) NULL,    \nOutPm10_24hr_minRT DECIMAL (5,1) NULL,   \nOutTpm10_24hr_minRT TIME NULL,   \nOutPm10_24hr_maxRT DECIMAL (5,1) NULL,   \nOutTpm10_24hr_maxRT TIME NULL,  \nOutAqiPm2p5_avgRT DECIMAL (5,1) NULL,             \nOutAqiPm2p5_minRT DECIMAL (5,1) NULL, \nOutTAqiPm2p5_minRT TIME NULL,  \nOutAqiPm2p5_maxRT DECIMAL (5,1) NULL,     \nOutTAqiPm2p5_maxRT TIME NULL,    \nOutAqiPm2p5_1hr_avgRT DECIMAL (5,1) NULL,          \nOutAqiPm2p5_1hr_minRT DECIMAL (5,1) NULL, \nOutTAqiPm2p5_1hr_minRT TIME NULL,\nOutAqiPm2p5_1hr_maxRT DECIMAL (5,1) NULL, \nOutTAqiPm2p5_1hr_maxRT TIME NULL,\nOutAqiPm2p5_3hr_avgRT DECIMAL (5,1) NULL,          \nOutAqiPm2p5_3hr_minRT DECIMAL (5,1) NULL,  \nOutTAqiPm2p5_3hr_minRT TIME NULL,\nOutAqiPm2p5_3hr_maxRT DECIMAL (5,1) NULL,\nOutTAqiPm2p5_3hr_maxRT TIME NULL,\nOutAqiPm2p5_24hr_avgRT DECIMAL (5,1) NULL,          \nOutAqiPm2p5_24hr_minRT DECIMAL (5,1) NULL,\nOutTAqiPm2p5_24hr_minRT TIME NULL,\nOutAqiPm2p5_24hr_maxRT DECIMAL (5,1) NULL,\nOutTAqiPm2p5_24hr_maxRT TIME NULL,\nOutAqiPm10_avgRT DECIMAL (5,1) NULL,            \nOutAqiPm10_minRT DECIMAL (5,1) NULL,    \nOutTAqiPm10_minRT TIME NULL,     \nOutAqiPm10_maxRT DECIMAL (5,1) NULL,     \nOutTAqiPm10_maxRT TIME NULL,     \nOutAqiPm10_1hr_avgRT DECIMAL (5,1) NULL,           \nOutAqiPm10_1hr_minRT DECIMAL (5,1) NULL,   \nOutTAqiPm10_1hr_minRT TIME NULL,\nOutAqiPm10_1hr_maxRT DECIMAL (5,1) NULL, \nOutTAqiPm10_1hr_maxRT TIME NULL,\nOutAqiPm10_3hr_avgRT DECIMAL (5,1) NULL,        \nOutAqiPm10_3hr_minRT DECIMAL (5,1) NULL,   \nOutTAqiPm10_3hr_minRT TIME NULL,\nOutAqiPm10_3hr_maxRT DECIMAL (5,1) NULL, \nOutTAqiPm10_3hr_maxRT TIME NULL,\nOutAqiPm10_24hr_avgRT DECIMAL (5,1) NULL,         \nOutAqiPm10_24hr_minRT DECIMAL (5,1) NULL, \nOutTAqiPm10_24hr_minRT TIME NULL,\nOutAqiPm10_24hr_maxRT DECIMAL (5,1) NULL, \nOutTAqiPm10_24hr_maxRT TIME NULL\n) AS (\n\nSELECT DATE(Realtime.LogDateTime) AS LogDateRT, \nag.OutPm1_avgRT AS OutPm1_avgRT, \nROUND(MIN(a1.pm1),1) AS OutPm1_minRT, a1.OutTPm1_minRT, \nROUND(MAX(b1.pm1),1) AS OutPm1_maxRT, b1.OutTPm1_maxRT,\n\nag.OutPm2p5_avgRT AS OutPm2p5_avgRT, \nROUND(MIN(c1.pm2p5),1) AS OutPm2p5_minRT, c1.OutTPm2p5_minRT, \nROUND(MAX(d1.pm2p5),1) AS OutPm2p5_maxRT, d1.OutTPm2p5_maxRT,\n\nag.OutPm2p5_1hr_avgRT AS OutPm2p5_1hr_avgRT, \nROUND(MIN(e1.pm2p5_1hr),1) AS OutPm2p5_1hr_minRT, e1.OutTPm2p5_1hr_minRT, \nROUND(MAX(f1.pm2p5_1hr),1) AS OutPm2p5_1hr_maxRT, f1.OutTpm2p5_1hr_maxRT,\n\nag.OutPm2p5_3hr_avgRT AS OutPm2p5_3hr_avgRT, \nROUND(MIN(g1.pm2p5_3hr),1) AS OutPm2p5_3hr_minRT, g1.OutTPm2p5_3hr_minRT, \nROUND(MAX(h1.pm2p5_3hr),1) AS OutPm2p5_3hr_maxRT, h1.OutTPm2p5_3hr_maxRT,\n\nag.OutPm2p5_24hr_avgRT AS OutPm2p5_24hr_avgRT, \nROUND(MIN(i1.pm2p5_24hr),1) AS OutPm2p5_24hr_minRT, i1.OutTPm2p5_24hr_minRT, \nROUND(MAX(j1.pm2p5_24hr),1) AS OutPm2p5_24hr_maxRT, j1.OutTPm2p5_24hr_maxRT,\n\nag.OutPm10_avgRT AS OutPm10_avgRT, \nROUND(MIN(k1.pm10),1) AS OutPm10_minRT, k1.OutTPm10_minRT, \nROUND(MAX(l1.pm10),1) AS OutPm10_maxRT, l1.OutTPm10_maxRT,\n\nag.OutPm10_1hr_avgRT AS OutPm10_1hr_avgRT, \nROUND(MIN(m1.pm10_1hr),1) AS OutPm10_1hr_minRT, m1.OutTPm10_1hr_minRT,\nROUND(MAX(n1.pm10_1hr),1) AS OutPm10_1hr_maxRT, n1.OutTPm10_1hr_maxRT,\n\nag.OutPm10_3hr_avgRT AS OutPm10_3hr_avgRT, \nROUND(MIN(o1.pm10_3hr),1) AS OutPm10_3hr_minRT, o1.OutTPm10_3hr_minRT, \nROUND(MAX(p1.pm10_3hr),1) AS OutPm10_3hr_maxRT, p1.OutTPm10_3hr_maxRT,\n\nag.OutPm10_24hr_avgRT AS OutPm10_24hr_avgRT, \nROUND(MIN(q1.pm10_24hr),1) AS OutPm10_24hr_minRT, q1.OutTPm10_24hr_minRT, \nROUND(MAX(r1.pm10_24hr),1) AS OutPm10_24hr_maxRT, r1.OutTPm10_24hr_maxRT,\n\nag.OutAqiPm2p5_avgRT AS OutAqiPm2p5_avgRT, \nROUND(MIN(a2.AQIpm2p5),1) AS OutAqiPm2p5_minRT, a2.OutTAqiPm2p5_minRT, \nROUND(MAX(b2.AQIpm2p5),1) AS OutAqiPm2p5_maxRT, b2.OutTAqiPm2p5_maxRT,\n\nag.OutAqiPm2p5_1hr_avgRT AS OutAqiPm2p5_1hr_avgRT, \nROUND(MIN(c2.AQIpm2p5_1hr),1) AS OutAqiPm2p5_1hr_minRT, c2.OutTAqiPm2p5_1hr_minRT, \nROUND(MAX(d2.AQIpm2p5_1hr),1) AS OutAqiPm2p5_1hr_maxRT, d2.OutTAqiPm2p5_1hr_maxRT,\n\nag.OutAqiPm2p5_3hr_avgRT AS OutAqiPm2p5_3hr_avgRT, \nROUND(MIN(e2.AQIpm2p5_3hr),1) AS OutAqiPm2p5_3hr_minRT, e2.OutTAqiPm2p5_3hr_minRT, \nROUND(MAX(f2.AQIpm2p5_3hr),1) AS OutAqiPm2p5_3hr_maxRT, f2.OutTAqiPm2p5_3hr_maxRT,\n\nag.OutAqiPm2p5_24hr_avgRT AS OutAqiPm2p5_24hr_avgRT, \nROUND(MIN(g2.AQIpm2p5_24hr),1) AS OutAqiPm2p5_24hr_minRT, g2.OutTAqiPm2p5_24hr_minRT, \nROUND(MAX(h2.AQIpm2p5_24hr),1) AS OutAqiPm2p5_24hr_maxRT, h2.OutTAqiPm2p5_24hr_maxRT,\n\nag.OutAqiPm10_avgRT AS OutAqiPm10_avgRT, \nROUND(MIN(i2.AQIpm10),1) AS OutAqiPm10_minRT, i2.OutTAqiPm10_minRT, \nROUND(MAX(j2.AQIpm10),1) AS OutAqiPm10_maxRT, j2.OutTAqiPm10_maxRT,\n\nag.OutAqiPm10_1hr_avgRT AS OutAqiPm10_1hr_avgRT, \nROUND(MIN(k2.AQIpm10_1hr),1) AS OutAqiPm10_1hr_minRT, k2.OutTAqiPm10_1hr_minRT, \nROUND(MAX(l2.AQIpm10_1hr),1) AS OutAqiPm10_1hr_maxRT, l2.OutTAqiPm10_1hr_maxRT,\n\nag.OutAqiPm10_3hr_avgRT AS OutAqiPm10_3hr_avgRT, \nROUND(MIN(m2.AQIpm10_3hr),1) AS OutAqiPm10_3hr_minRT, m2.OutTAqiPm10_3hr_minRT, \nROUND(MAX(n2.AQIpm10_3hr),1) AS OutAqiPm10_3hr_maxRT, n2.OutTAqiPm10_3hr_maxRT,\n\nag.OutAqiPm10_24hr_avgRT AS OutAqiPm10_24hr_avgRT, \nROUND(MIN(o2.AQIpm10_24hr),1) AS OutAqiPm10_24hr_minRT, o2.OutTAqiPm10_24hr_minRT, \nROUND(MAX(p2.AQIpm10_24hr),1) AS OutAqiPm10_24hr_maxRT, p2.OutTAqiPm10_24hr_maxRT\n\nFROM Realtime\n\nINNER JOIN(\n\t-- average values\n                SELECT Realtime.LogDateTime AS LogDate, \n\t\tROUND(AVG(Realtime.pm1),1) AS OutPm1_avgRT,\n\t\tROUND(AVG(Realtime.pm2p5),1) AS OutPm2p5_avgRT,\n\t\tROUND(AVG(Realtime.pm2p5_1hr),1) AS OutPm2p5_1hr_avgRT,\n\t\tROUND(AVG(Realtime.pm2p5_3hr),1) AS OutPm2p5_3hr_avgRT,\n\t\tROUND(AVG(Realtime.pm2p5_24hr),1) AS OutPm2p5_24hr_avgRT,\n\t\tROUND(AVG(Realtime.pm10),1) AS OutPm10_avgRT,\n\t\tROUND(AVG(Realtime.pm10_1hr),1) AS OutPm10_1hr_avgRT,\n\t\tROUND(AVG(Realtime.pm10_3hr),1) AS OutPm10_3hr_avgRT,\n\t\tROUND(AVG(Realtime.pm10_24hr),1) AS OutPm10_24hr_avgRT,\n\t\t\n\t\tROUND(AVG(Realtime.AQIpm2p5),1) AS OutAqiPm2p5_avgRT,\n\t\tROUND(AVG(Realtime.AQIpm2p5_1hr),1) AS OutAqiPm2p5_1hr_avgRT,\n\t\tROUND(AVG(Realtime.AQIpm2p5_3hr),1) AS OutAqiPm2p5_3hr_avgRT,\n\t\tROUND(AVG(Realtime.AQIpm2p5_24hr),1) AS OutAqiPm2p5_24hr_avgRT,\n\t\tROUND(AVG(Realtime.AQIpm10),1) AS OutAqiPm10_avgRT,\n\t\tROUND(AVG(Realtime.AQIpm10_1hr),1) AS OutAqiPm10_1hr_avgRT,\n\t\tROUND(AVG(Realtime.AQIpm10_3hr),1) AS OutAqiPm10_3hr_avgRT,\n\t\tROUND(AVG(Realtime.AQIpm10_24hr),1) AS OutAqiPm10_24hr_avgRT\n\tFROM Realtime\n    WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\tGROUP BY DAY(Realtime.LogDateTime), MONTH(Realtime.LogDateTime), YEAR(Realtime.LogDateTime)\n\t) ag ON DATE(Realtime.LogDateTime) = DATE(ag.LogDate)\n\n-- a1:  Pm1_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm1_minRT, pm1  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm1 ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()  \n\t) t\n\tWHERE t.rn = 1 )\na1 ON (Realtime.LogDateTime) = (a1.LogDate)\n\n-- b1: Pm1_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm1_maxRT, pm1  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm1 DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nb1 ON DATE(Realtime.LogDateTime) = DATE(b1.LogDate)\n\n-- c1:  Pm2p5_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm2p5_minRT, pm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5 ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nc1 ON DATE(Realtime.LogDateTime) = DATE(c1.LogDate)\n\n-- d1: Pm2p5_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm2p5_maxRT, pm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5 DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nd1 ON DATE(Realtime.LogDateTime) = DATE(d1.LogDate)\n\n-- e1:  Pm2p5_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_1hr_minRT, pm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5_1hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ne1 ON DATE(Realtime.LogDateTime) = DATE(e1.LogDate)\n\n-- f1: Pm2p5_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_1hr_maxRT, pm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5_1hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nf1 ON DATE(Realtime.LogDateTime) = DATE(f1.LogDate)\n\n-- g1:  Pm2p5_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_3hr_minRT, pm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5_3hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ng1 ON DATE(Realtime.LogDateTime) = DATE(g1.LogDate)\n\n-- h1: Pm2p5_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_3hr_maxRT, pm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5_3hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nh1 ON DATE(Realtime.LogDateTime) = DATE(h1.LogDate)\n\n-- i1:  Pm2p5_24hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_24hr_minRT, pm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5_24hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ni1 ON DATE(Realtime.LogDateTime) = DATE(i1.LogDate)\n\n-- j1: Pm2p5_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_24hr_maxRT, pm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm2p5_24hr DESC, LogDateTime) rn\n\t  FROM Realtime \n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nj1 ON DATE(Realtime.LogDateTime) = DATE(j1.LogDate)\n\n-- k1:  Pm10_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm10_minRT, pm10  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10 ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nk1 ON DATE(Realtime.LogDateTime) = DATE(k1.LogDate)\n\n-- l1: Pm10_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm10_maxRT, pm10  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10 DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nl1 ON DATE(Realtime.LogDateTime) = DATE(l1.LogDate)\n\n-- m1:  OutTpm10_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_1hr_minRT, pm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10_1hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nm1 ON DATE(Realtime.LogDateTime) = DATE(m1.LogDate)\n\n-- n1: OutTpm10_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_1hr_maxRT, pm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10_1hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nn1 ON DATE(Realtime.LogDateTime) = DATE(n1.LogDate)\n\n-- o1:  OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_3hr_minRT, pm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10_3hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE() \n\t) t\n\tWHERE t.rn = 1 )\no1 ON DATE(Realtime.LogDateTime) = DATE(o1.LogDate)\n\n-- p1: OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_3hr_maxRT, pm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10_3hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE() \n\t) t\n\tWHERE t.rn = 1 )\np1 ON DATE(Realtime.LogDateTime) = DATE(p1.LogDate)\n\n-- q1:  OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_24hr_minRT, pm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10_24hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nq1 ON DATE(Realtime.LogDateTime) = DATE(q1.LogDate)\n\n-- r1: OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_24hr_maxRT, pm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY pm10_24hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nr1 ON DATE(Realtime.LogDateTime) = DATE(r1.LogDate)\n\n\n-- a2:  AQIpm2p5_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_minRT, AQIpm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5 ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\na2 ON DATE(Realtime.LogDateTime) = DATE(a2.LogDate)\n\n-- b2: AQIm2p5_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_maxRT, AQIpm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5 DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nb2 ON DATE(Realtime.LogDateTime) = DATE(b2.LogDate)\n\n-- c2:  AQIpm2p5_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_1hr_minRT, AQIpm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5_1hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nc2 ON DATE(Realtime.LogDateTime) = DATE(c2.LogDate)\n\n-- d2: AQIpm2p5_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_1hr_maxRT, AQIpm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5_1hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nd2 ON DATE(Realtime.LogDateTime) = DATE(d2.LogDate)\n\n-- e2:  AQIpm2p5_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_3hr_minRT, AQIpm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5_3hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ne2 ON DATE(Realtime.LogDateTime) = DATE(e2.LogDate)\n\n-- f2: AQIpm2p5_3hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_3hr_maxRT, AQIpm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5_3hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nf2 ON DATE(Realtime.LogDateTime) = DATE(f2.LogDate)\n\n-- g2:  AQIpm2p5_24hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_24hr_minRT, AQIpm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5_24hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ng2 ON DATE(Realtime.LogDateTime) = DATE(g2.LogDate)\n\n-- h2: AQIpm2p5_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_24hr_maxRT, AQIpm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm2p5_24hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nh2 ON DATE(Realtime.LogDateTime) = DATE(h2.LogDate)\n\n-- i2:  AQIpm10_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_minRT, AQIpm10 \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10 ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ni2 ON DATE(Realtime.LogDateTime) = DATE(i2.LogDate)\n\n-- j2: AQIpm10_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_maxRT, AQIpm10  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10 DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nj2 ON DATE(Realtime.LogDateTime) = DATE(j2.LogDate)\n\n-- k2:  AQIpm10_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_1hr_minRT, AQIpm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10_1hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nk2 ON DATE(Realtime.LogDateTime) = DATE(k2.LogDate)\n\n-- l2: AQIpm10_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_1hr_maxRT, AQIpm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10_1hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nl2 ON DATE(Realtime.LogDateTime) = DATE(l2.LogDate)\n\n-- m2:  AQIpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_3hr_minRT, AQIpm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10_3hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nm2 ON DATE(Realtime.LogDateTime) = DATE(m2.LogDate)\n\n-- n2:  AQIpm10_3hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_3hr_maxRT, AQIpm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10_3hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nn2 ON DATE(Realtime.LogDateTime) = DATE(n2.LogDate)\n\n\n-- o2: AQIpm10_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_24hr_minRT, AQIpm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10_24hr ASC, LogDateTime) rn\n\t  FROM Realtime\n\t WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\no2 ON DATE(Realtime.LogDateTime) = DATE(o2.LogDate)\n\n-- p2: AQIpm10_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_24hr_maxRT, AQIpm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY AQIpm10_24hr DESC, LogDateTime) rn\n\t  FROM Realtime\n\t  WHERE DATE(Realtime.LogDateTime) &gt; @lastUpdated AND DATE(Realtime.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\np2 ON DATE(Realtime.LogDateTime) = DATE(p2.LogDate)\n\n);\n\n\n-- values from monthly table\nDROP TEMPORARY TABLE IF EXISTS monthlyData;\nCREATE TEMPORARY TABLE IF NOT EXISTS monthlyData (\nLogDate DATE NOT NULL,          \nOutPm1_avg DECIMAL (5,1) NULL,          \nOutPm1_min DECIMAL (5,1) NULL,            \nOutTPm1_min TIME NULL,         \nOutPm1_max DECIMAL (5,1) NULL,           \nOutTPm1_max TIME NULL,       \nOutPm2p5_avg DECIMAL (5,1) NULL,         \nOutPm2p5_min DECIMAL (5,1) NULL,        \nOutTPm2p5_min TIME NULL,       \nOutPm2p5_max DECIMAL (5,1) NULL,        \nOutTPm2p5_max TIME NULL,     \nOutPm2p5_1hr_avg DECIMAL (5,1) NULL,     \nOutPm2p5_1hr_min DECIMAL (5,1) NULL,    \nOutTpm2p5_1hr_min TIME NULL,  \nOutPm2p5_1hr_max DECIMAL (5,1) NULL,    \nOutTpm2p5_1hr_max TIME NULL,  \nOutPm2p5_3hr_avg DECIMAL (5,1) NULL,    \nOutPm2p5_3hr_min DECIMAL (5,1) NULL,    \nOutTpm2p5_3hr_min TIME NULL,\nOutPm2p5_3hr_max DECIMAL (5,1) NULL,    \nOutTpm2p5_3hr_max TIME NULL,  \nOutPm2p5_24hr_avg DECIMAL (5,1) NULL,   \nOutPm2p5_24hr_min DECIMAL (5,1) NULL,    \nOutTpm2p5_24hr_min TIME NULL,  \nOutPm2p5_24hr_max DECIMAL (5,1) NULL,    \nOutTpm2p5_24hr_max TIME NULL, \nOutPm10_avg DECIMAL (5,1) NULL,           \nOutPm10_min DECIMAL (5,1) NULL,          \nOutTPm10_min TIME NULL,   \nOutPm10_max DECIMAL (5,1) NULL,         \nOutTPm10_max TIME NULL,      \nOutPm10_1hr_avg DECIMAL (5,1) NULL,    \nOutPm10_1hr_min DECIMAL (5,1) NULL,   \nOutTpm10_1hr_min TIME NULL,  \nOutPm10_1hr_max DECIMAL (5,1) NULL,      \nOutTpm10_1hr_max TIME NULL,   \nOutPm10_3hr_avg DECIMAL (5,1) NULL,     \nOutPm10_3hr_min DECIMAL (5,1) NULL,     \nOutTpm10_3hr_min TIME NULL,   \nOutPm10_3hr_max DECIMAL (5,1) NULL,     \nOutTpm10_3hr_max TIME NULL,    \nOutPm10_24hr_avg DECIMAL (5,1) NULL,    \nOutPm10_24hr_min DECIMAL (5,1) NULL,   \nOutTpm10_24hr_min TIME NULL,   \nOutPm10_24hr_max DECIMAL (5,1) NULL,   \nOutTpm10_24hr_max TIME NULL,  \nOutAqiPm2p5_avg DECIMAL (5,1) NULL,             \nOutAqiPm2p5_min DECIMAL (5,1) NULL, \nOutTAqiPm2p5_min TIME NULL,  \nOutAqiPm2p5_max DECIMAL (5,1) NULL,     \nOutTAqiPm2p5_max TIME NULL,    \nOutAqiPm2p5_1hr_avg DECIMAL (5,1) NULL,          \nOutAqiPm2p5_1hr_min DECIMAL (5,1) NULL, \nOutTAqiPm2p5_1hr_min TIME NULL,\nOutAqiPm2p5_1hr_max DECIMAL (5,1) NULL, \nOutTAqiPm2p5_1hr_max TIME NULL,\nOutAqiPm2p5_3hr_avg DECIMAL (5,1) NULL,          \nOutAqiPm2p5_3hr_min DECIMAL (5,1) NULL,  \nOutTAqiPm2p5_3hr_min TIME NULL,\nOutAqiPm2p5_3hr_max DECIMAL (5,1) NULL,\nOutTAqiPm2p5_3hr_max TIME NULL,\nOutAqiPm2p5_24hr_avg DECIMAL (5,1) NULL,          \nOutAqiPm2p5_24hr_min DECIMAL (5,1) NULL,\nOutTAqiPm2p5_24hr_min TIME NULL,\nOutAqiPm2p5_24hr_max DECIMAL (5,1) NULL,\nOutTAqiPm2p5_24hr_max TIME NULL,\nOutAqiPm10_avg DECIMAL (5,1) NULL,            \nOutAqiPm10_min DECIMAL (5,1) NULL,    \nOutTAqiPm10_min TIME NULL,     \nOutAqiPm10_max DECIMAL (5,1) NULL,     \nOutTAqiPm10_max TIME NULL,     \nOutAqiPm10_1hr_avg DECIMAL (5,1) NULL,           \nOutAqiPm10_1hr_min DECIMAL (5,1) NULL,   \nOutTAqiPm10_1hr_min TIME NULL,\nOutAqiPm10_1hr_max DECIMAL (5,1) NULL, \nOutTAqiPm10_1hr_max TIME NULL,\nOutAqiPm10_3hr_avg DECIMAL (5,1) NULL,        \nOutAqiPm10_3hr_min DECIMAL (5,1) NULL,   \nOutTAqiPm10_3hr_min TIME NULL,\nOutAqiPm10_3hr_max DECIMAL (5,1) NULL, \nOutTAqiPm10_3hr_max TIME NULL,\nOutAqiPm10_24hr_avg DECIMAL (5,1) NULL,         \nOutAqiPm10_24hr_min DECIMAL (5,1) NULL, \nOutTAqiPm10_24hr_min TIME NULL,\nOutAqiPm10_24hr_max DECIMAL (5,1) NULL, \nOutTAqiPm10_24hr_max TIME NULL\n) AS (\n\nSELECT DATE(MonthlyAirQual.LogDateTime) AS LogDate, \nag.OutPm1_avg AS OutPm1_avg, \nROUND(MIN(a1.OutPm1),1) AS OutPm1_min, a1.OutTPm1_min, \nROUND(MAX(b1.OutPm1),1) AS OutPm1_max, b1.OutTPm1_max,\n\nag.OutPm2p5_avg AS OutPm2p5_avg, \nROUND(MIN(c1.OutPm2p5),1) AS OutPm2p5_min, c1.OutTPm2p5_min, \nROUND(MAX(d1.OutPm2p5),1) AS OutPm2p5_max, d1.OutTPm2p5_max,\n\nag.OutPm2p5_1hr_avg AS OutPm2p5_1hr_avg, \nROUND(MIN(e1.OutPm2p5_1hr),1) AS OutPm2p5_1hr_min, e1.OutTPm2p5_1hr_min, \nROUND(MAX(f1.OutPm2p5_1hr),1) AS OutPm2p5_1hr_max, f1.OutTpm2p5_1hr_max,\n\nag.OutPm2p5_3hr_avg AS OutPm2p5_3hr_avg, \nROUND(MIN(g1.OutPm2p5_3hr),1) AS OutPm2p5_3hr_min, g1.OutTPm2p5_3hr_min, \nROUND(MAX(h1.OutPm2p5_3hr),1) AS OutPm2p5_3hr_max, h1.OutTPm2p5_3hr_max,\n\nag.OutPm2p5_24hr_avg AS OutPm2p5_24hr_avg, \nROUND(MIN(i1.OutPm2p5_24hr),1) AS OutPm2p5_24hr_min, i1.OutTPm2p5_24hr_min, \nROUND(MAX(j1.OutPm2p5_24hr),1) AS OutPm2p5_24hr_max, j1.OutTPm2p5_24hr_max,\n\nag.OutPm10_avg AS OutPm10_avg, \nROUND(MIN(k1.OutPm10),1) AS OutPm10_min, k1.OutTPm10_min, \nROUND(MAX(l1.OutPm10),1) AS OutPm10_max, l1.OutTPm10_max,\n\nag.OutPm10_1hr_avg AS OutPm10_1hr_avg, \nROUND(MIN(m1.OutPm10_1hr),1) AS OutPm10_1hr_min, m1.OutTPm10_1hr_min,\nROUND(MAX(n1.OutPm10_1hr),1) AS OutPm10_1hr_max, n1.OutTPm10_1hr_max,\n\nag.OutPm10_3hr_avg AS OutPm10_3hr_avg, \nROUND(MIN(o1.OutPm10_3hr),1) AS OutPm10_3hr_min, o1.OutTPm10_3hr_min, \nROUND(MAX(p1.OutPm10_3hr),1) AS OutPm10_3hr_max, p1.OutTPm10_3hr_max,\n\nag.OutPm10_24hr_avg AS OutPm10_24hr_avg, \nROUND(MIN(q1.OutPm10_24hr),1) AS OutPm10_24hr_min, q1.OutTPm10_24hr_min, \nROUND(MAX(r1.OutPm10_24hr),1) AS OutPm10_24hr_max, r1.OutTPm10_24hr_max,\n\nag.OutAqiPm2p5_avg AS OutAqiPm2p5_avg, \nROUND(MIN(a2.OutAqiPm2p5),1) AS OutAqiPm2p5_min, a2.OutTAqiPm2p5_min, \nROUND(MAX(b2.OutAqiPm2p5),1) AS OutAqiPm2p5_max, b2.OutTAqiPm2p5_max,\n\nag.OutAqiPm2p5_1hr_avg AS OutAqiPm2p5_1hr_avg, \nROUND(MIN(c2.OutAqiPm2p5_1hr),1) AS OutAqiPm2p5_1hr_min, c2.OutTAqiPm2p5_1hr_min, \nROUND(MAX(d2.OutAqiPm2p5_1hr),1) AS OutAqiPm2p5_1hr_max, d2.OutTAqiPm2p5_1hr_max,\n\nag.OutAqiPm2p5_3hr_avg AS OutAqiPm2p5_3hr_avg, \nROUND(MIN(e2.OutAqiPm2p5_3hr),1) AS OutAqiPm2p5_3hr_min, e2.OutTAqiPm2p5_3hr_min, \nROUND(MAX(f2.OutAqiPm2p5_3hr),1) AS OutAqiPm2p5_3hr_max, f2.OutTAqiPm2p5_3hr_max,\n\nag.OutAqiPm2p5_24hr_avg AS OutAqiPm2p5_24hr_avg, \nROUND(MIN(g2.OutAqiPm2p5_24hr),1) AS OutAqiPm2p5_24hr_min, g2.OutTAqiPm2p5_24hr_min, \nROUND(MAX(h2.OutAqiPm2p5_24hr),1) AS OutAqiPm2p5_24hr_max, h2.OutTAqiPm2p5_24hr_max,\n\nag.OutAqiPm10_avg AS OutAqiPm10_avg, \nROUND(MIN(i2.OutAqiPm10),1) AS OutAqiPm10_min, i2.OutTAqiPm10_min, \nROUND(MAX(j2.OutAqiPm10),1) AS OutAqiPm10_max, j2.OutTAqiPm10_max,\n\nag.OutAqiPm10_1hr_avg AS OutAqiPm10_1hr_avg, \nROUND(MIN(k2.OutAqiPm10_1hr),1) AS OutAqiPm10_1hr_min, k2.OutTAqiPm10_1hr_min, \nROUND(MAX(l2.OutAqiPm10_1hr),1) AS OutAqiPm10_1hr_max, l2.OutTAqiPm10_1hr_max,\n\nag.OutAqiPm10_3hr_avg AS OutAqiPm10_3hr_avg, \nROUND(MIN(m2.OutAqiPm10_3hr),1) AS OutAqiPm10_3hr_min, m2.OutTAqiPm10_3hr_min, \nROUND(MAX(n2.OutAqiPm10_3hr),1) AS OutAqiPm10_3hr_max, n2.OutTAqiPm10_3hr_max,\n\nag.OutAqiPm10_24hr_avg AS OutAqiPm10_24hr_avg, \nROUND(MIN(o2.OutAqiPm10_24hr),1) AS OutAqiPm10_24hr_min, o2.OutTAqiPm10_24hr_min, \nROUND(MAX(p2.OutAqiPm10_24hr),1) AS OutAqiPm10_24hr_max, p2.OutTAqiPm10_24hr_max\n\nFROM MonthlyAirQual\n\n\nINNER JOIN(\n\t-- average values\n                SELECT MonthlyAirQual.LogDateTime AS LogDate, \n\t\tROUND(AVG(MonthlyAirQual.OutPm1),1) AS OutPm1_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm2p5),1) AS OutPm2p5_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm2p5_1hr),1) AS OutPm2p5_1hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm2p5_3hr),1) AS OutPm2p5_3hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm2p5_24hr),1) AS OutPm2p5_24hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm10),1) AS OutPm10_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm10_1hr),1) AS OutPm10_1hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm10_3hr),1) AS OutPm10_3hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutPm10_24hr),1) AS OutPm10_24hr_avg,\n\t\t\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm2p5),1) AS OutAqiPm2p5_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm2p5_1hr),1) AS OutAqiPm2p5_1hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm2p5_3hr),1) AS OutAqiPm2p5_3hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm2p5_24hr),1) AS OutAqiPm2p5_24hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm10),1) AS OutAqiPm10_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm10_1hr),1) AS OutAqiPm10_1hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm10_3hr),1) AS OutAqiPm10_3hr_avg,\n\t\tROUND(AVG(MonthlyAirQual.OutAqiPm10_24hr),1) AS OutAqiPm10_24hr_avg\n\tFROM MonthlyAirQual\n    WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\tGROUP BY DAY(MonthlyAirQual.LogDateTime), MONTH(MonthlyAirQual.LogDateTime), YEAR(MonthlyAirQual.LogDateTime)\n\t) ag ON DATE(MonthlyAirQual.LogDateTime) = DATE(ag.LogDate)\n\n-- a1:  Pm1_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm1_min, OutPm1  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm1 ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\na1 ON (MonthlyAirQual.LogDateTime) = (a1.LogDate)\n\n-- b1: Pm1_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm1_max, OutPm1  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm1 DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nb1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(b1.LogDate)\n\n-- c1:  Pm2p5_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm2p5_min, OutPm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5 ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nc1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(c1.LogDate)\n\n-- d1: Pm2p5_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm2p5_max, OutPm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5 DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nd1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(d1.LogDate)\n\n-- e1:  Pm2p5_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_1hr_min, OutPm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5_1hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ne1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(e1.LogDate)\n\n-- f1: Pm2p5_1hr_maxRT\nINNER JOIN(\n\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_1hr_max, OutPm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5_1hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nf1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(f1.LogDate)\n\n-- g1:  Pm2p5_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_3hr_min, OutPm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5_3hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ng1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(g1.LogDate)\n\n-- h1: Pm2p5_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_3hr_max, OutPm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5_3hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nh1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(h1.LogDate)\n\n-- i1:  Pm2p5_24hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_24hr_min, OutPm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5_24hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ni1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(i1.LogDate)\n\n-- j1: Pm2p5_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm2p5_24hr_max, OutPm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm2p5_24hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual \n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nj1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(j1.LogDate)\n\n-- k1:  Pm10_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm10_min, OutPm10  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10 ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nk1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(k1.LogDate)\n\n-- l1: Pm10_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTPm10_max, OutPm10  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10 DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nl1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(l1.LogDate)\n\n-- m1:  OutTpm10_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_1hr_min, OutPm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10_1hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nm1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(m1.LogDate)\n\n-- n1: OutTpm10_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_1hr_max, OutPm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10_1hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nn1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(n1.LogDate)\n\n-- o1:  OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_3hr_min, OutPm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10_3hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\no1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(o1.LogDate)\n\n-- p1: OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_3hr_max, OutPm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10_3hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\np1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(p1.LogDate)\n\n-- q1:  OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_24hr_min, OutPm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10_24hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nq1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(q1.LogDate)\n\n-- r1: OutTpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTpm10_24hr_max, OutPm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutPm10_24hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nr1 ON DATE(MonthlyAirQual.LogDateTime) = DATE(r1.LogDate)\n\n\n-- a2:  AQIpm2p5_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_min, OutAqiPm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5 ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\na2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(a2.LogDate)\n\n-- b2: AQIm2p5_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_max, OutAqiPm2p5  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5 DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE() \n\t) t\n\tWHERE t.rn = 1 )\nb2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(b2.LogDate)\n\n-- c2:  AQIpm2p5_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_1hr_min, OutAqiPm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5_1hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nc2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(c2.LogDate)\n\n-- d2: AQIpm2p5_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_1hr_max, OutAqiPm2p5_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5_1hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nd2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(d2.LogDate)\n\n-- e2:  AQIpm2p5_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_3hr_min, OutAqiPm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5_3hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ne2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(e2.LogDate)\n\n-- f2: AQIpm2p5_3hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_3hr_max, OutAqiPm2p5_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5_3hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nf2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(f2.LogDate)\n\n-- g2:  AQIpm2p5_24hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_24hr_min, OutAqiPm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5_24hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE() \n\t) t\n\tWHERE t.rn = 1 )\ng2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(g2.LogDate)\n\n-- h2: AQIpm2p5_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm2p5_24hr_max, OutAqiPm2p5_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm2p5_24hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nh2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(h2.LogDate)\n\n-- i2:  AQIpm10_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_min, OutAqiPm10 \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10 ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\ni2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(i2.LogDate)\n\n-- j2: AQIpm10_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_max, OutAqiPm10  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10 DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE() \n\t) t\n\tWHERE t.rn = 1 )\nj2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(j2.LogDate)\n\n-- k2:  AQIpm10_1hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_1hr_min, OutAqiPm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10_1hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nk2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(k2.LogDate)\n\n-- l2: AQIpm10_1hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_1hr_max, OutAqiPm10_1hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10_1hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE() \n\t) t\n\tWHERE t.rn = 1 )\nl2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(l2.LogDate)\n\n-- m2:  AQIpm10_3hr_minRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_3hr_min, OutAqiPm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10_3hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nm2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(m2.LogDate)\n\n-- n2:  AQIpm10_3hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_3hr_max, OutAqiPm10_3hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10_3hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\nn2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(n2.LogDate)\n\n\n-- o2: AQIpm10_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_24hr_min, OutAqiPm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10_24hr ASC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\no2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(o2.LogDate)\n\n-- p2: AQIpm10_24hr_maxRT\nINNER JOIN(\n\tSELECT (LogDateTime) AS LogDate, TIME_FORMAT(LogDateTime,\"%H:%i\") AS OutTAqiPm10_24hr_max, OutAqiPm10_24hr  \n\tFROM (\n\t  SELECT *, \n\t    ROW_NUMBER() OVER (PARTITION BY DATE(LogDateTime) ORDER BY OutAqiPm10_24hr DESC, LogDateTime) rn\n\t  FROM MonthlyAirQual\n\t  WHERE DATE(MonthlyAirQual.LogDateTime) &gt; @lastUpdated AND DATE(MonthlyAirQual.LogDateTime) &lt; CURDATE()\n\t) t\n\tWHERE t.rn = 1 )\np2 ON DATE(MonthlyAirQual.LogDateTime) = DATE(p2.LogDate)\n    \nGROUP BY DAY(MonthlyAirQual.LogDateTime), MONTH(MonthlyAirQual.LogDateTime), YEAR(MonthlyAirQual.LogDateTime)\n\n);\n\n-- insert data from temporary tables\nINSERT IGNORE INTO DailyAirQual (\n       \nLogDate,          \nOutPm1_avg,          \nOutPm1_min,            \nOutTPm1_min,         \nOutPm1_max,           \nOutTPm1_max,       \nOutPm2p5_avg,         \nOutPm2p5_min,        \nOutTPm2p5_min,       \nOutPm2p5_max,        \nOutTPm2p5_max,     \nOutPm2p5_1hr_avg,     \nOutPm2p5_1hr_min,    \nOutTpm2p5_1hr_min,  \nOutPm2p5_1hr_max,    \nOutTpm2p5_1hr_max,  \nOutPm2p5_3hr_avg,    \nOutPm2p5_3hr_min,    \nOutTpm2p5_3hr_min,\nOutPm2p5_3hr_max,    \nOutTpm2p5_3hr_max,  \nOutPm2p5_24hr_avg,   \nOutPm2p5_24hr_min,    \nOutTpm2p5_24hr_min,  \nOutPm2p5_24hr_max,    \nOutTpm2p5_24hr_max, \nOutPm10_avg,           \nOutPm10_min,          \nOutTPm10_min,   \nOutPm10_max,         \nOutTPm10_max,      \nOutPm10_1hr_avg,    \nOutPm10_1hr_min,   \nOutTpm10_1hr_min,  \nOutPm10_1hr_max,      \nOutTpm10_1hr_max,   \nOutPm10_3hr_avg,     \nOutPm10_3hr_min,     \nOutTpm10_3hr_min,   \nOutPm10_3hr_max,     \nOutTpm10_3hr_max,    \nOutPm10_24hr_avg,    \nOutPm10_24hr_min,   \nOutTpm10_24hr_min,   \nOutPm10_24hr_max,   \nOutTpm10_24hr_max,  \nOutAqiPm2p5_avg,             \nOutAqiPm2p5_min, \nOutTAqiPm2p5_min,  \nOutAqiPm2p5_max,     \nOutTAqiPm2p5_max,    \nOutAqiPm2p5_1hr_avg,          \nOutAqiPm2p5_1hr_min, \nOutTAqiPm2p5_1hr_min,\nOutAqiPm2p5_1hr_max, \nOutTAqiPm2p5_1hr_max,\nOutAqiPm2p5_3hr_avg,          \nOutAqiPm2p5_3hr_min,  \nOutTAqiPm2p5_3hr_min,\nOutAqiPm2p5_3hr_max,\nOutTAqiPm2p5_3hr_max,\nOutAqiPm2p5_24hr_avg,          \nOutAqiPm2p5_24hr_min,\nOutTAqiPm2p5_24hr_min,\nOutAqiPm2p5_24hr_max,\nOutTAqiPm2p5_24hr_max,\nOutAqiPm10_avg,            \nOutAqiPm10_min,    \nOutTAqiPm10_min,     \nOutAqiPm10_max,     \nOutTAqiPm10_max,     \nOutAqiPm10_1hr_avg,           \nOutAqiPm10_1hr_min,   \nOutTAqiPm10_1hr_min,\nOutAqiPm10_1hr_max, \nOutTAqiPm10_1hr_max,\nOutAqiPm10_3hr_avg,        \nOutAqiPm10_3hr_min,   \nOutTAqiPm10_3hr_min,\nOutAqiPm10_3hr_max, \nOutTAqiPm10_3hr_max,\nOutAqiPm10_24hr_avg,         \nOutAqiPm10_24hr_min, \nOutTAqiPm10_24hr_min,\nOutAqiPm10_24hr_max, \nOutTAqiPm10_24hr_max\n\n)\n-- use GREATEST and COALESCE to return the highest non null value\nSELECT DATE(monthlyData.LogDate) AS LogDate,\nROUND(GREATEST(COALESCE(rtData.OutPm1_avgRT,0),monthlyData.OutPm1_avg),1) AS OutPm1_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm1_minRT,0),monthlyData.OutPm1_min),1) AS OutPm1_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm1_minRT,0),monthlyData.OutPm1_min) = rtData.OutPm1_minRT THEN rtData.OutTPm1_minRT ELSE monthlyData.OutTPm1_min END AS OutTPm1_min,\nROUND(GREATEST(COALESCE(rtData.OutPm1_maxRT,0),monthlyData.OutPm1_max),1) AS OutPm1_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm1_maxRT,0),monthlyData.OutPm1_max) = rtData.OutPm1_maxRT THEN rtData.OutTPm1_maxRT ELSE monthlyData.OutTPm1_max END AS OutTPm1_max,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_avgRT,0),monthlyData.OutPm2p5_avg),1) AS OutPm2p5_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_minRT,0),monthlyData.OutPm2p5_min),1) AS OutPm2p5_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_minRT,0),monthlyData.OutPm2p5_min) = rtData.OutPm2p5_minRT THEN rtData.OutTPm2p5_minRT ELSE monthlyData.OutTPm2p5_min END AS OutTPm2p5_min,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_maxRT,0),monthlyData.OutPm2p5_max),1) AS OutPm2p5_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_maxRT,0),monthlyData.OutPm2p5_max) = rtData.OutPm2p5_maxRT THEN rtData.OutTPm2p5_maxRT ELSE monthlyData.OutTPm2p5_max END AS OutTPm2p5_min,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_1hr_avgRT,0),monthlyData.OutPm2p5_1hr_avg),1) AS OutPm2p5_1hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_1hr_minRT,0),monthlyData.OutPm2p5_1hr_min),1) AS OutPm2p5_1hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_1hr_minRT,0),monthlyData.OutPm2p5_1hr_min) = rtData.OutPm2p5_1hr_minRT THEN rtData.OutTPm2p5_1hr_minRT ELSE monthlyData.OutTPm2p5_1hr_min END AS OutTPm2p5_1hr_min,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_1hr_maxRT,0),monthlyData.OutPm2p5_1hr_max),1) AS OutPm2p5_1hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_1hr_maxRT,0),monthlyData.OutPm2p5_1hr_max) = rtData.OutPm2p5_1hr_maxRT THEN rtData.OutTPm2p5_1hr_maxRT ELSE monthlyData.OutTPm2p5_1hr_max END AS OutTPm2p5_1hr_max,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_3hr_avgRT,0),monthlyData.OutPm2p5_3hr_avg),1) AS OutPm2p5_3hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_3hr_minRT,0),monthlyData.OutPm2p5_3hr_min),1) AS OutPm2p5_3hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_3hr_minRT,0),monthlyData.OutPm2p5_3hr_min) = rtData.OutPm2p5_3hr_minRT THEN rtData.OutTPm2p5_3hr_minRT ELSE monthlyData.OutTPm2p5_3hr_min END AS OutTPm2p5_3hr_min,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_3hr_maxRT,0),monthlyData.OutPm2p5_3hr_max),1) AS OutPm2p5_3hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_3hr_maxRT,0),monthlyData.OutPm2p5_3hr_max) = rtData.OutPm2p5_3hr_maxRT THEN rtData.OutTPm2p5_3hr_maxRT ELSE monthlyData.OutTPm2p5_3hr_max END AS OutTPm2p5_3hr_max,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_24hr_avgRT,0),monthlyData.OutPm2p5_24hr_avg),1) AS OutPm2p5_24hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_24hr_minRT,0),monthlyData.OutPm2p5_24hr_min),1) AS OutPm2p5_24hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_24hr_minRT,0),monthlyData.OutPm2p5_24hr_min) = rtData.OutPm2p5_24hr_minRT THEN rtData.OutTPm2p5_24hr_minRT ELSE monthlyData.OutTPm2p5_24hr_min END AS OutTPm2p5_24hr_min,\nROUND(GREATEST(COALESCE(rtData.OutPm2p5_24hr_maxRT,0),monthlyData.OutPm2p5_24hr_max),1) AS OutPm2p5_24hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm2p5_24hr_maxRT,0),monthlyData.OutPm2p5_24hr_max) = rtData.OutPm2p5_24hr_maxRT THEN rtData.OutTPm2p5_24hr_maxRT ELSE monthlyData.OutTPm2p5_24hr_max END AS OutTPm2p5_24hr_max,\nROUND(GREATEST(COALESCE(rtData.OutPm10_avgRT,0),monthlyData.OutPm10_avg),1) AS OutPm10_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm10_minRT,0),monthlyData.OutPm10_min),1) AS OutPm10_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_minRT,0),monthlyData.OutPm10_min) = rtData.OutPm10_minRT THEN rtData.OutTPm10_minRT ELSE monthlyData.OutTPm10_min END AS OutTPm10_min,\nROUND(GREATEST(COALESCE(rtData.OutPm10_maxRT,0),monthlyData.OutPm10_max),1) AS OutPm10_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_maxRT,0),monthlyData.OutPm10_max) = rtData.OutPm10_maxRT THEN rtData.OutTPm10_maxRT ELSE monthlyData.OutTPm10_max END AS OutTPm10_max,\nROUND(GREATEST(COALESCE(rtData.OutPm10_1hr_avgRT,0),monthlyData.OutPm10_1hr_avg),1) AS OutPm10_1hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm10_1hr_minRT,0),monthlyData.OutPm10_1hr_min),1) AS OutPm10_1hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_1hr_minRT,0),monthlyData.OutPm10_1hr_min) = rtData.OutPm10_1hr_minRT THEN rtData.OutTPm10_1hr_minRT ELSE monthlyData.OutTPm10_1hr_min END AS OutTPm10_1hr_min,\nROUND(GREATEST(COALESCE(rtData.OutPm10_1hr_maxRT,0),monthlyData.OutPm10_1hr_max),1) AS OutPm10_1hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_1hr_maxRT,0),monthlyData.OutPm10_1hr_max) = rtData.OutPm10_1hr_maxRT THEN rtData.OutTPm10_1hr_maxRT ELSE monthlyData.OutTPm10_1hr_max END AS OutTPm10_1hr_max,\nROUND(GREATEST(COALESCE(rtData.OutPm10_3hr_avgRT,0),monthlyData.OutPm10_3hr_avg),1) AS OutPm10_3hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm10_3hr_minRT,0),monthlyData.OutPm10_3hr_min),1) AS OutPm10_3hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_3hr_minRT,0),monthlyData.OutPm10_3hr_min) = rtData.OutPm10_3hr_minRT THEN rtData.OutTPm10_3hr_minRT ELSE monthlyData.OutTPm10_3hr_min END AS OutTPm10_3hr_min,\nROUND(GREATEST(COALESCE(rtData.OutPm10_3hr_maxRT,0),monthlyData.OutPm10_3hr_max),1) AS OutPm10_3hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_3hr_maxRT,0),monthlyData.OutPm10_3hr_max) = rtData.OutPm10_3hr_maxRT THEN rtData.OutTPm10_3hr_maxRT ELSE monthlyData.OutTPm10_3hr_max END AS OutTPm10_3hr_max,\nROUND(GREATEST(COALESCE(rtData.OutPm10_24hr_avgRT,0),monthlyData.OutPm10_24hr_avg),1) AS OutPm10_24hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutPm10_24hr_minRT,0),monthlyData.OutPm10_24hr_min),1) AS OutPm10_24hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_24hr_minRT,0),monthlyData.OutPm10_24hr_min) = rtData.OutPm10_24hr_minRT THEN rtData.OutTPm10_24hr_minRT ELSE monthlyData.OutTPm10_24hr_min END AS OutTPm10_24hr_min,\nROUND(GREATEST(COALESCE(rtData.OutPm10_24hr_maxRT,0),monthlyData.OutPm10_24hr_max),1) AS OutPm10_24hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutPm10_24hr_maxRT,0),monthlyData.OutPm10_24hr_max) = rtData.OutPm10_24hr_maxRT THEN rtData.OutTPm10_24hr_maxRT ELSE monthlyData.OutTPm10_24hr_max END AS OutTPm10_24hr_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_avgRT,0),monthlyData.OutAqiPm2p5_avg),1) AS OutAqiPm2p5_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_minRT,0),monthlyData.OutAqiPm2p5_min),1) AS OutAqiPm2p5_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_minRT,0),monthlyData.OutAqiPm2p5_min) = rtData.OutAqiPm2p5_minRT THEN rtData.OutTAqiPm2p5_minRT ELSE monthlyData.OutTAqiPm2p5_min END AS OutTAqiPm2p5_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_maxRT,0),monthlyData.OutAqiPm2p5_max),1) AS OutAqiPm2p5_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_maxRT,0),monthlyData.OutAqiPm2p5_max) = rtData.OutAqiPm2p5_maxRT THEN rtData.OutTAqiPm2p5_maxRT ELSE monthlyData.OutTAqiPm2p5_max END AS OutTAqiPm2p5_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_1hr_avgRT,0),monthlyData.OutAqiPm2p5_1hr_avg),1) AS OutAqiPm2p5_1hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_1hr_minRT,0),monthlyData.OutAqiPm2p5_1hr_min),1) AS OutAqiPm2p5_1hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_1hr_minRT,0),monthlyData.OutAqiPm2p5_1hr_min) = rtData.OutAqiPm2p5_1hr_minRT THEN rtData.OuttAqiPm2p5_1hr_minRT ELSE monthlyData.OuttAqiPm2p5_1hr_min END AS OuttAqiPm2p5_1hr_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_1hr_maxRT,0),monthlyData.OutAqiPm2p5_1hr_max),1) AS OutAqiPm2p5_1hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_1hr_maxRT,0),monthlyData.OutAqiPm2p5_1hr_max) = rtData.OutAqiPm2p5_1hr_maxRT THEN rtData.OuttAqiPm2p5_1hr_maxRT ELSE monthlyData.OuttAqiPm2p5_1hr_max END AS OuttAqiPm2p5_1hr_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_3hr_avgRT,0),monthlyData.OutAqiPm2p5_3hr_avg),1) AS OutAqiPm2p5_3hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_3hr_minRT,0),monthlyData.OutAqiPm2p5_3hr_min),1) AS OutAqiPm2p5_3hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_3hr_minRT,0),monthlyData.OutAqiPm2p5_3hr_min) = rtData.OutAqiPm2p5_3hr_minRT THEN rtData.OuttAqiPm2p5_3hr_minRT ELSE monthlyData.OuttAqiPm2p5_3hr_min END AS OuttAqiPm2p5_3hr_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_3hr_maxRT,0),monthlyData.OutAqiPm2p5_3hr_max),1) AS OutAqiPm2p5_3hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_3hr_maxRT,0),monthlyData.OutAqiPm2p5_3hr_max) = rtData.OutAqiPm2p5_3hr_maxRT THEN rtData.OuttAqiPm2p5_3hr_maxRT ELSE monthlyData.OuttAqiPm2p5_3hr_max END AS OuttAqiPm2p5_3hr_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_24hr_avgRT,0),monthlyData.OutAqiPm2p5_24hr_avg),1) AS OutAqiPm2p5_24hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_24hr_minRT,0),monthlyData.OutAqiPm2p5_24hr_min),1) AS OutAqiPm2p5_24hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_24hr_minRT,0),monthlyData.OutAqiPm2p5_24hr_min) = rtData.OutAqiPm2p5_24hr_minRT THEN rtData.OuttAqiPm2p5_24hr_minRT ELSE monthlyData.OuttAqiPm2p5_24hr_min END AS OuttAqiPm2p5_24hr_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm2p5_24hr_maxRT,0),monthlyData.OutAqiPm2p5_24hr_max),1) AS OutAqiPm2p5_24hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm2p5_24hr_maxRT,0),monthlyData.OutAqiPm2p5_24hr_max) = rtData.OutAqiPm2p5_24hr_maxRT THEN rtData.OuttAqiPm2p5_24hr_maxRT ELSE monthlyData.OuttAqiPm2p5_24hr_max END AS OuttAqiPm2p5_24hr_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_avgRT,0),monthlyData.OutAqiPm10_avg),1) AS OutAqiPm10_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_minRT,0),monthlyData.OutAqiPm10_min),1) AS OutAqiPm10_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_minRT,0),monthlyData.OutAqiPm10_min) = rtData.OutAqiPm10_minRT THEN rtData.OutTAqiPm10_minRT ELSE monthlyData.OutTAqiPm10_min END AS OutTAqiPm10_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_maxRT,0),monthlyData.OutAqiPm10_max),1) AS OutAqiPm10_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_maxRT,0),monthlyData.OutAqiPm10_max) = rtData.OutAqiPm10_maxRT THEN rtData.OutTAqiPm10_maxRT ELSE monthlyData.OutTAqiPm10_max END AS OutTAqiPm10_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_1hr_avgRT,0),monthlyData.OutAqiPm10_1hr_avg),1) AS OutAqiPm10_1hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_1hr_minRT,0),monthlyData.OutAqiPm10_1hr_min),1) AS OutAqiPm10_1hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_1hr_minRT,0),monthlyData.OutAqiPm10_1hr_min) = rtData.OutAqiPm10_1hr_minRT THEN rtData.OuttAqiPm10_1hr_minRT ELSE monthlyData.OuttAqiPm10_1hr_min END AS OuttAqiPm10_1hr_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_1hr_maxRT,0),monthlyData.OutAqiPm10_1hr_max),1) AS OutAqiPm10_1hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_1hr_maxRT,0),monthlyData.OutAqiPm10_1hr_max) = rtData.OutAqiPm10_1hr_maxRT THEN rtData.OuttAqiPm10_1hr_maxRT ELSE monthlyData.OuttAqiPm10_1hr_max END AS OuttAqiPm10_1hr_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_3hr_avgRT,0),monthlyData.OutAqiPm10_3hr_avg),1) AS OutAqiPm10_3hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_3hr_minRT,0),monthlyData.OutAqiPm10_3hr_min),1) AS OutAqiPm10_3hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_3hr_minRT,0),monthlyData.OutAqiPm10_3hr_min) = rtData.OutAqiPm10_3hr_minRT THEN rtData.OuttAqiPm10_3hr_minRT ELSE monthlyData.OuttAqiPm10_3hr_min END AS OuttAqiPm10_3hr_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_3hr_maxRT,0),monthlyData.OutAqiPm10_3hr_max),1) AS OutAqiPm10_3hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_3hr_maxRT,0),monthlyData.OutAqiPm10_3hr_max) = rtData.OutAqiPm10_3hr_maxRT THEN rtData.OuttAqiPm10_3hr_maxRT ELSE monthlyData.OuttAqiPm10_3hr_max END AS OuttAqiPm10_3hr_max,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_24hr_avgRT,0),monthlyData.OutAqiPm10_24hr_avg),1) AS OutAqiPm10_24hr_avg,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_24hr_minRT,0),monthlyData.OutAqiPm10_24hr_min),1) AS OutAqiPm10_24hr_min,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_24hr_minRT,0),monthlyData.OutAqiPm10_24hr_min) = rtData.OutAqiPm10_24hr_minRT THEN rtData.OuttAqiPm10_24hr_minRT ELSE monthlyData.OuttAqiPm10_24hr_min END AS OuttAqiPm10_24hr_min,\nROUND(GREATEST(COALESCE(rtData.OutAqiPm10_24hr_maxRT,0),monthlyData.OutAqiPm10_24hr_max),1) AS OutAqiPm10_24hr_max,\nCASE WHEN GREATEST(COALESCE(rtData.OutAqiPm10_24hr_maxRT,0),monthlyData.OutAqiPm10_24hr_max) = rtData.OutAqiPm10_24hr_maxRT THEN rtData.OuttAqiPm10_24hr_maxRT ELSE monthlyData.OuttAqiPm10_24hr_max END AS OuttAqiPm10_24hr_max\nFROM rtData\n\n-- join the monthly data to the realtime data\nRIGHT JOIN monthlyData ON DAY(rtData.LogDateRT) = DAY(monthlyData.LogDate) AND MONTH(rtData.LogDateRT) = MONTH(monthlyData.LogDate) AND YEAR(rtData.LogDateRT) = YEAR(monthlyData.LogDate)\nGROUP BY DAY(monthlyData.LogDate), MONTH(monthlyData.LogDate), YEAR(monthlyData.LogDate);\n\nCOMMIT;\n\nEND$$\nDELIMITER ;<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A PHP script contains SQL queries that retrieve the necessary information from this table and  are assigns to variables when the web page is visited. This allows for these statistics to be shown on the web page and is the same principle as several other statistics on these and other pages. The SQL queries are fairly simple because the daily air quality data already shows all the required summarised information for each day. <\/p>\n<div class=\"pld-like-dislike-wrap pld-template-1\">\r\n    <div class=\"pld-like-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-like-trigger pld-like-dislike-trigger  \" title=\"\" data-post-id=\"231\" data-trigger-type=\"like\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-up\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-like-count-wrap pld-count-wrap\">0    <\/span>\r\n<\/div><div class=\"pld-dislike-wrap  pld-common-wrap\">\r\n    <a href=\"javascript:void(0)\" class=\"pld-dislike-trigger pld-like-dislike-trigger  \" title=\"\" data-post-id=\"231\" data-trigger-type=\"dislike\" data-restriction=\"cookie\" data-already-liked=\"0\">\r\n                        <i class=\"fas fa-thumbs-down\"><\/i>\r\n                <\/a>\r\n    <span class=\"pld-dislike-count-wrap pld-count-wrap\">0<\/span>\r\n<\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>The air quality data we recently began to measure has been expanded to include statistics for this month, this year and all-time. &nbsp;This data is now available on the this month and year and all-time record pages. In the short period that we have been measuring air quality the air is exceptionally clean. For the [&hellip;]<\/p>\n<div style='clear:both'><\/div><div  class='the_champ_sharing_container the_champ_horizontal_sharing' data-super-socializer-href=\"https:\/\/fernygroveweather.com\/blog\/2021\/02\/17\/new-air-quality-statistics\/\"><div class='the_champ_sharing_title' style=\"font-weight:bold\" >Want to share this?<\/div><div class=\"the_champ_sharing_ul\"><a aria-label=\"Facebook\" class=\"the_champ_facebook\" href=\"https:\/\/www.facebook.com\/sharer\/sharer.php?u=https%3A%2F%2Ffernygroveweather.com%2Fblog%2F2021%2F02%2F17%2Fnew-air-quality-statistics%2F\" title=\"Facebook\" rel=\"nofollow noopener\" target=\"_blank\" style=\"font-size:24px!important;box-shadow:none;display:inline-block;vertical-align:middle\"><span class=\"the_champ_svg\" style=\"background-color:#0765FE;width:35px;height:35px;border-radius:999px;display:inline-block;opacity:1;float:left;font-size:24px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box\"><svg style=\"display:block;border-radius:999px;\" focusable=\"false\" aria-hidden=\"true\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 32 32\"><path fill=\"#fff\" d=\"M28 16c0-6.627-5.373-12-12-12S4 9.373 4 16c0 5.628 3.875 10.35 9.101 11.647v-7.98h-2.474V16H13.1v-1.58c0-4.085 1.849-5.978 5.859-5.978.76 0 2.072.15 2.608.298v3.325c-.283-.03-.775-.045-1.386-.045-1.967 0-2.728.745-2.728 2.683V16h3.92l-.673 3.667h-3.247v8.245C23.395 27.195 28 22.135 28 16Z\"><\/path><\/svg><\/span><span class=\"the_champ_square_count the_champ_facebook_count\">&nbsp;<\/span><\/a><a aria-label=\"Twitter\" class=\"the_champ_button_twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?text=New%20air%20quality%20statistics&url=https%3A%2F%2Ffernygroveweather.com%2Fblog%2F2021%2F02%2F17%2Fnew-air-quality-statistics%2F\" title=\"Twitter\" rel=\"nofollow noopener\" target=\"_blank\" style=\"font-size:24px!important;box-shadow:none;display:inline-block;vertical-align:middle\"><span class=\"the_champ_svg the_champ_s__default the_champ_s_twitter\" style=\"background-color:#55acee;width:35px;height:35px;border-radius:999px;display:inline-block;opacity:1;float:left;font-size:24px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box\"><svg style=\"display:block;border-radius:999px;\" focusable=\"false\" aria-hidden=\"true\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100%\" height=\"100%\" viewBox=\"-4 -4 39 39\"><path d=\"M28 8.557a9.913 9.913 0 0 1-2.828.775 4.93 4.93 0 0 0 2.166-2.725 9.738 9.738 0 0 1-3.13 1.194 4.92 4.92 0 0 0-3.593-1.55 4.924 4.924 0 0 0-4.794 6.049c-4.09-.21-7.72-2.17-10.15-5.15a4.942 4.942 0 0 0-.665 2.477c0 1.71.87 3.214 2.19 4.1a4.968 4.968 0 0 1-2.23-.616v.06c0 2.39 1.7 4.38 3.952 4.83-.414.115-.85.174-1.297.174-.318 0-.626-.03-.928-.086a4.935 4.935 0 0 0 4.6 3.42 9.893 9.893 0 0 1-6.114 2.107c-.398 0-.79-.023-1.175-.068a13.953 13.953 0 0 0 7.55 2.213c9.056 0 14.01-7.507 14.01-14.013 0-.213-.005-.426-.015-.637.96-.695 1.795-1.56 2.455-2.55z\" fill=\"#fff\"><\/path><\/svg><\/span><span class=\"the_champ_square_count the_champ_twitter_count\">&nbsp;<\/span><\/a><a aria-label=\"Linkedin\" class=\"the_champ_button_linkedin\" href=\"https:\/\/www.linkedin.com\/sharing\/share-offsite\/?url=https%3A%2F%2Ffernygroveweather.com%2Fblog%2F2021%2F02%2F17%2Fnew-air-quality-statistics%2F\" title=\"Linkedin\" rel=\"nofollow noopener\" target=\"_blank\" style=\"font-size:24px!important;box-shadow:none;display:inline-block;vertical-align:middle\"><span class=\"the_champ_svg the_champ_s__default the_champ_s_linkedin\" style=\"background-color:#0077b5;width:35px;height:35px;border-radius:999px;display:inline-block;opacity:1;float:left;font-size:24px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box\"><svg style=\"display:block;border-radius:999px;\" focusable=\"false\" aria-hidden=\"true\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 32 32\"><path d=\"M6.227 12.61h4.19v13.48h-4.19V12.61zm2.095-6.7a2.43 2.43 0 0 1 0 4.86c-1.344 0-2.428-1.09-2.428-2.43s1.084-2.43 2.428-2.43m4.72 6.7h4.02v1.84h.058c.56-1.058 1.927-2.176 3.965-2.176 4.238 0 5.02 2.792 5.02 6.42v7.395h-4.183v-6.56c0-1.564-.03-3.574-2.178-3.574-2.18 0-2.514 1.7-2.514 3.46v6.668h-4.187V12.61z\" fill=\"#fff\"><\/path><\/svg><\/span><span class=\"the_champ_square_count the_champ_linkedin_count\">&nbsp;<\/span><\/a><a aria-label=\"Email\" class=\"the_champ_email\" href=\"https:\/\/fernygroveweather.com\/blog\/2021\/02\/17\/new-air-quality-statistics\/\" onclick=\"event.preventDefault();window.open('mailto:?subject=' + decodeURIComponent('New%20air%20quality%20statistics').replace('&', '%26') + '&body=' + decodeURIComponent('https%3A%2F%2Ffernygroveweather.com%2Fblog%2F2021%2F02%2F17%2Fnew-air-quality-statistics%2F'), '_blank')\" title=\"Email\" rel=\"noopener\" style=\"font-size:24px!important;box-shadow:none;display:inline-block;vertical-align:middle\"><span class=\"the_champ_svg\" style=\"background-color:#649a3f;width:35px;height:35px;border-radius:999px;display:inline-block;opacity:1;float:left;font-size:24px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box\"><svg style=\"display:block;border-radius:999px;\" focusable=\"false\" aria-hidden=\"true\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100%\" height=\"100%\" viewBox=\"-.5 -.5 36 36\"><path d=\"M 5.5 11 h 23 v 1 l -11 6 l -11 -6 v -1 m 0 2 l 11 6 l 11 -6 v 11 h -22 v -11\" stroke-width=\"1\" fill=\"#fff\"><\/path><\/svg><\/span><span class=\"the_champ_square_count the_champ_email_count\">&nbsp;<\/span><\/a><a aria-label=\"Outlook.com\" class=\"the_champ_button_outlook_com\" href=\"https:\/\/mail.live.com\/default.aspx?rru=compose?subject=New%20air%20quality%20statistics&body=https%3A%2F%2Ffernygroveweather.com%2Fblog%2F2021%2F02%2F17%2Fnew-air-quality-statistics%2F&lc=1033&id=64855&mkt=en-us&cbcxt=mai\" title=\"Outlook.com\" rel=\"nofollow noopener\" target=\"_blank\" style=\"font-size:24px!important;box-shadow:none;display:inline-block;vertical-align:middle\"><span class=\"the_champ_svg the_champ_s__default the_champ_s_outlook_com\" style=\"background-color:#0072c6;width:35px;height:35px;border-radius:999px;display:inline-block;opacity:1;float:left;font-size:24px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box\"><svg style=\"display:block;border-radius:999px;\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"-4 -3.5 40 40\" width=\"100%\" height=\"100%\"><path fill=\"#fff\" d=\"M19.52 8.29v5.5l1.92 1.208c.053.016.163.016.212 0l8.27-5.574c0-.66-.613-1.134-.962-1.134h-9.44z\"\/><path fill=\"#fff\" d=\"M19.52 15.84l1.755 1.204c.246.183.543 0 .543 0-.297.183 8.104-5.397 8.104-5.397V21.75c0 1.102-.704 1.562-1.496 1.562H19.52V15.84z\"\/><g fill=\"#fff\"><path d=\"M10.445 13.305c-.6 0-1.073.282-1.426.842-.355.56-.53 1.305-.53 2.23 0 .936.175 1.677.53 2.22.347.546.813.82 1.38.82.59 0 1.055-.266 1.4-.795.344-.53.517-1.266.517-2.206 0-.984-.17-1.744-.502-2.288-.333-.55-.79-.823-1.37-.823z\"\/><path d=\"M2.123 5.5v21.51l16.362 3.428V2.33L2.123 5.5zm10.95 14.387c-.693.91-1.594 1.367-2.706 1.367-1.082 0-1.967-.442-2.65-1.324-.68-.88-1.02-2.03-1.02-3.448 0-1.496.343-2.707 1.037-3.63.693-.926 1.614-1.388 2.754-1.388 1.08 0 1.955.438 2.62 1.324.667.885 1 2.05 1 3.495.004 1.496-.345 2.695-1.034 3.604z\"\/><\/g><\/svg><\/span><span class=\"the_champ_square_count the_champ_Outlook.com_count\">&nbsp;<\/span><\/a><a aria-label=\"Gmail\" class=\"the_champ_button_google_gmail\" href=\"https:\/\/mail.google.com\/mail\/?ui=2&view=cm&fs=1&tf=1&su=New%20air%20quality%20statistics&body=Link:https%3A%2F%2Ffernygroveweather.com%2Fblog%2F2021%2F02%2F17%2Fnew-air-quality-statistics%2F\" title=\"Google Gmail\" rel=\"nofollow noopener\" target=\"_blank\" style=\"font-size:24px!important;box-shadow:none;display:inline-block;vertical-align:middle\"><span class=\"the_champ_svg the_champ_s__default the_champ_s_Google_Gmail\" style=\"background-color:#e5e5e5;width:35px;height:35px;border-radius:999px;display:inline-block;opacity:1;float:left;font-size:24px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box\"><svg style=\"display:block;border-radius:999px;\" focusable=\"false\" aria-hidden=\"true\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 32 32\"><path fill=\"#fff\" d=\"M2.902 6.223h26.195v19.554H2.902z\"><\/path><path fill=\"#E14C41\" class=\"the_champ_no_fill\" d=\"M2.902 25.777h26.195V6.223H2.902v19.554zm22.44-4.007v3.806H6.955v-3.6h.032l.093-.034 6.9-5.558 2.09 1.77 1.854-1.63 7.42 5.246zm0-.672l-7.027-4.917 7.028-6.09V21.1zm-1.17-14.67l-.947.905c-2.356 2.284-4.693 4.75-7.17 6.876l-.078.06L8.062 6.39l16.11.033zm-10.597 9.61l-6.62 5.294.016-10.914 6.607 5.62\"><\/path><\/svg><\/span><span class=\"the_champ_square_count the_champ_Google_Gmail_count\">&nbsp;<\/span><\/a><a aria-label=\"Copy Link\" class=\"the_champ_button_copy_link\" title=\"Copy Link\" rel=\"noopener\" href=\"https:\/\/fernygroveweather.com\/blog\/2021\/02\/17\/new-air-quality-statistics\/\" onclick=\"event.preventDefault()\" style=\"font-size:24px!important;box-shadow:none;display:inline-block;vertical-align:middle\"><span class=\"the_champ_svg the_champ_s__default the_champ_s_copy_link\" style=\"background-color:#ffc112;width:35px;height:35px;border-radius:999px;display:inline-block;opacity:1;float:left;font-size:24px;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box\"><svg style=\"display:block;border-radius:999px;\" focusable=\"false\" aria-hidden=\"true\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"100%\" height=\"100%\" viewBox=\"-4 -4 40 40\"><path fill=\"#fff\" d=\"M24.412 21.177c0-.36-.126-.665-.377-.917l-2.804-2.804a1.235 1.235 0 0 0-.913-.378c-.377 0-.7.144-.97.43.026.028.11.11.255.25.144.14.24.236.29.29s.117.14.2.256c.087.117.146.232.177.344.03.112.046.236.046.37 0 .36-.126.666-.377.918a1.25 1.25 0 0 1-.918.377 1.4 1.4 0 0 1-.373-.047 1.062 1.062 0 0 1-.345-.175 2.268 2.268 0 0 1-.256-.2 6.815 6.815 0 0 1-.29-.29c-.14-.142-.223-.23-.25-.254-.297.28-.445.607-.445.984 0 .36.126.664.377.916l2.778 2.79c.243.243.548.364.917.364.36 0 .665-.118.917-.35l1.982-1.97c.252-.25.378-.55.378-.9zm-9.477-9.504c0-.36-.126-.665-.377-.917l-2.777-2.79a1.235 1.235 0 0 0-.913-.378c-.35 0-.656.12-.917.364L7.967 9.92c-.254.252-.38.553-.38.903 0 .36.126.665.38.917l2.802 2.804c.242.243.547.364.916.364.377 0 .7-.14.97-.418-.026-.027-.11-.11-.255-.25s-.24-.235-.29-.29a2.675 2.675 0 0 1-.2-.255 1.052 1.052 0 0 1-.176-.344 1.396 1.396 0 0 1-.047-.37c0-.36.126-.662.377-.914.252-.252.557-.377.917-.377.136 0 .26.015.37.046.114.03.23.09.346.175.117.085.202.153.256.2.054.05.15.148.29.29.14.146.222.23.25.258.294-.278.442-.606.442-.983zM27 21.177c0 1.078-.382 1.99-1.146 2.736l-1.982 1.968c-.745.75-1.658 1.12-2.736 1.12-1.087 0-2.004-.38-2.75-1.143l-2.777-2.79c-.75-.747-1.12-1.66-1.12-2.737 0-1.106.392-2.046 1.183-2.818l-1.186-1.185c-.774.79-1.708 1.186-2.805 1.186-1.078 0-1.995-.376-2.75-1.13l-2.803-2.81C5.377 12.82 5 11.903 5 10.826c0-1.08.382-1.993 1.146-2.738L8.128 6.12C8.873 5.372 9.785 5 10.864 5c1.087 0 2.004.382 2.75 1.146l2.777 2.79c.75.747 1.12 1.66 1.12 2.737 0 1.105-.392 2.045-1.183 2.817l1.186 1.186c.774-.79 1.708-1.186 2.805-1.186 1.078 0 1.995.377 2.75 1.132l2.804 2.804c.754.755 1.13 1.672 1.13 2.75z\"\/><\/svg><\/span><span class=\"the_champ_square_count the_champ_Copy_Link_count\">&nbsp;<\/span><\/a><a class=\"the_champ_more\" title=\"More\" rel=\"nofollow noopener\" style=\"font-size:24px!important;border:0;box-shadow:none;display:inline-block!important;font-size:16px;padding:0 4px;vertical-align: middle;display:inline;\" href=\"https:\/\/fernygroveweather.com\/blog\/2021\/02\/17\/new-air-quality-statistics\/\" onclick=\"event.preventDefault()\"><span class=\"the_champ_square_count\">&nbsp;<\/span><span class=\"the_champ_svg\" style=\"background-color:#ee8e2d;width:35px;height:35px;border-radius:999px;display:inline-block!important;opacity:1;float:left;font-size:32px!important;box-shadow:none;display:inline-block;font-size:16px;padding:0 4px;vertical-align:middle;display:inline;background-repeat:repeat;overflow:hidden;padding:0;cursor:pointer;box-sizing:content-box;\" onclick=\"theChampMoreSharingPopup(this, 'https:\/\/fernygroveweather.com\/blog\/2021\/02\/17\/new-air-quality-statistics\/', 'New%20air%20quality%20statistics', '' )\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" xmlns:xlink=\"http:\/\/www.w3.org\/1999\/xlink\" viewBox=\"-.3 0 32 32\" version=\"1.1\" width=\"100%\" height=\"100%\" style=\"display:block;border-radius:999px;\" xml:space=\"preserve\"><g><path fill=\"#fff\" d=\"M18 14V8h-4v6H8v4h6v6h4v-6h6v-4h-6z\" fill-rule=\"evenodd\"><\/path><\/g><\/svg><\/span><\/a><a style=\"font-size:24px!important;box-shadow:none;display:inline-block!important;font-size: 16px;padding: 0 4px;vertical-align:middle;display:inline;\" class=\"theChampSharingRound\"><span class=\"the_champ_square_count\">&nbsp;<\/span><div style=\"width:35px;height:35px;border-radius:999px;margin-left:9px !important;\" title=\"Total Shares\" class=\"theChampSharing theChampTCBackground\"><\/div><\/a><\/div><\/div><div style='clear:both'><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,5],"tags":[],"class_list":["post-231","post","type-post","status-publish","format-standard","hentry","category-announcements","category-web-development"],"_links":{"self":[{"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/posts\/231","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/comments?post=231"}],"version-history":[{"count":8,"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/posts\/231\/revisions"}],"predecessor-version":[{"id":241,"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/posts\/231\/revisions\/241"}],"wp:attachment":[{"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/media?parent=231"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/categories?post=231"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fernygroveweather.com\/blog\/wp-json\/wp\/v2\/tags?post=231"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}