The AssignmentWe now present the text of the assignment.
A Weather Forecasting and Monitoring Systemopen-exercise exam Weather.docx The Entity/Relationship DiagramIn the following picture, the E/R diagram for the assignment is presented. The MySQL workbench
project file can be downloaded from this link.
The following code was automatically generated by MySQL workbench out of the above E/R diagrams by
using the command "Forward Engineering". This code can be executed on MySQL community server.
Data Definition and Insertion StatementsSET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; USE `mydb` ; -- ----------------------------------------------------- -- Table `mydb`.`property` -- ----------------------------------------------------- DROP TABLE IF EXISTS `mydb`.`property` ; CREATE TABLE IF NOT EXISTS `mydb`.`property` ( `ptyname` VARCHAR(45) NOT NULL , `unit` VARCHAR(45) NULL , PRIMARY KEY (`ptyname`) ) ENGINE = MyISAM; -- ----------------------------------------------------- -- Table `mydb`.`station` -- ----------------------------------------------------- DROP TABLE IF EXISTS `mydb`.`station` ; CREATE TABLE IF NOT EXISTS `mydb`.`station` ( `location` POINT NOT NULL , `elevation` INT NULL , PRIMARY KEY (`location`) ) ENGINE = MyISAM; -- ----------------------------------------------------- -- Table `mydb`.`installedSensor` -- ----------------------------------------------------- DROP TABLE IF EXISTS `mydb`.`installedSensor` ; CREATE TABLE IF NOT EXISTS `mydb`.`installedSensor` ( `location` POINT NOT NULL , `property` VARCHAR(45) NOT NULL , PRIMARY KEY (`location`, `property`) , INDEX `station` (`location` ASC) , INDEX `sensor` (`property` ASC) , CONSTRAINT `station` FOREIGN KEY (`location` ) REFERENCES `mydb`.`station` (`location` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `sensor` FOREIGN KEY (`property` ) REFERENCES `mydb`.`property` (`ptyname` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = MyISAM; -- ----------------------------------------------------- -- Table `mydb`.`measurement` -- ----------------------------------------------------- DROP TABLE IF EXISTS `mydb`.`measurement` ; CREATE TABLE IF NOT EXISTS `mydb`.`measurement` ( `location` POINT NOT NULL , `property` VARCHAR(45) NOT NULL , `dateTime` DATETIME NOT NULL , `value` DECIMAL(2) NULL , PRIMARY KEY (`location`, `property`, `dateTime`) , INDEX `sensor` (`location` ASC, `property` ASC) , CONSTRAINT `sensor` FOREIGN KEY (`location` , `property` ) REFERENCES `mydb`.`installedSensor` (`location` , `property` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = MyISAM; -- ----------------------------------------------------- -- Table `mydb`.`forecast` -- ----------------------------------------------------- DROP TABLE IF EXISTS `mydb`.`forecast` ; CREATE TABLE IF NOT EXISTS `mydb`.`forecast` ( `location` POINT NOT NULL , `property` VARCHAR(45) NOT NULL , `dateTime` DATETIME NOT NULL , `value` DECIMAL(2) NULL , PRIMARY KEY (`location`, `property`, `dateTime`) , INDEX `sensors` (`location` ASC, `property` ASC) , CONSTRAINT `sensors` FOREIGN KEY (`location` , `property` ) REFERENCES `mydb`.`installedSensor` (`location` , `property` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = MyISAM; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; -- ----------------------------------------------------- -- Data for table `mydb`.`property` -- ----------------------------------------------------- SET AUTOCOMMIT=0; USE `mydb`; INSERT INTO `mydb`.`property` (`ptyname`, `unit`) VALUES ('temperature', 'C'); INSERT INTO `mydb`.`property` (`ptyname`, `unit`) VALUES ('pressure', 'mBars'); INSERT INTO `mydb`.`property` (`ptyname`, `unit`) VALUES ('humidity', 'perc'); INSERT INTO `mydb`.`property` (`ptyname`, `unit`) VALUES ('rain', 'mm/h'); INSERT INTO `mydb`.`property` (`ptyname`, `unit`) VALUES ('windSpeed', 'm/s'); INSERT INTO `mydb`.`property` (`ptyname`, `unit`) VALUES ('windDirection', 'n/a'); COMMIT; -- ----------------------------------------------------- -- Data for table `mydb`.`station` -- ----------------------------------------------------- SET AUTOCOMMIT=0; USE `mydb`; INSERT INTO `mydb`.`station` (`location`, `elevation`) VALUES (GeomFromText('POINT(0 0)'), '5'); INSERT INTO `mydb`.`station` (`location`, `elevation`) VALUES (GeomFromText('POINT(1 1)'), '10'); INSERT INTO `mydb`.`station` (`location`, `elevation`) VALUES (GeomFromText('POINT(2 3)'), '15'); COMMIT; -- ----------------------------------------------------- -- Data for table `mydb`.`installedSensor` -- ----------------------------------------------------- SET AUTOCOMMIT=0; USE `mydb`; INSERT INTO `mydb`.`installedSensor` (`location`, `property`) VALUES (GeomFromText('POINT(2 3)'), 'temperature'); INSERT INTO `mydb`.`installedSensor` (`location`, `property`) VALUES (GeomFromText('POINT(0 0)'), 'pressure'); COMMIT; -- ----------------------------------------------------- -- Data for table `mydb`.`measurement` -- ----------------------------------------------------- SET AUTOCOMMIT=0; USE `mydb`; INSERT INTO `mydb`.`measurement` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(0 0)'), 'pressure', '2010-01-21 12:00:00', '12'); INSERT INTO `mydb`.`measurement` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(2 3)'), 'temperature', '2010-01-21 12:00:00', '23'); INSERT INTO `mydb`.`measurement` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(2 3)'), 'temperature', '2010-01-21 00:00:00', '12'); INSERT INTO `mydb`.`measurement` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(0 0)'), 'rain', '2010-01-21 12:00:00', '0'); INSERT INTO `mydb`.`measurement` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(0 0)'), 'pressure', '2010-01-22 12:00:00', '12'); INSERT INTO `mydb`.`measurement` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(0 0)'), 'rain', '2010-01-22 12:00:00', '5'); COMMIT; -- ----------------------------------------------------- -- Data for table `mydb`.`forecast` -- ----------------------------------------------------- SET AUTOCOMMIT=0; USE `mydb`; INSERT INTO `mydb`.`forecast` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(0 0)'), 'pressure', '2010-02-21', '12'); INSERT INTO `mydb`.`forecast` (`location`, `property`, `dateTime`, `value`) VALUES (GeomFromText('POINT(2 3)'), 'temperature', '2010-02-21', '32'); COMMIT; SQL QueriesBelow we present the four SQL queries that perform the tasks required in the assignment. Furthermore,
the bonus query that implements a weather forecasting functionality is also presented.
Query 1SELECT asWKT(mydb.measurement.location), mydb.measurement.dateTime, mydb.measurement.value FROM mydb.measurement WHERE mydb.measurement.location = GeomFromText('POINT(0 0)') AND mydb.measurement.property = 'pressure'; Query 2SELECT asWKT(mydb.measurement.location), MIN(mydb.measurement.value) as MIN, MAX(mydb.measurement.value) as MAX, AVG(mydb.measurement.value) as AVG FROM mydb.measurement WHERE mydb.measurement.location = GeomFromText('POINT(2 3)') AND mydb.measurement.property = 'temperature'; GROUP BY DATE(mydb.measurement.datetime) HAVING DATE(mydb.measurement.datetime) = '2010-01-21'; Query 3SELECT DISTINCT COUNT(mydb.measurement.location) FROM mydb.measurement WHERE DATE(mydb.measurement.datetime) = '2010-01-21' AND mydb.measurement.property = 'temperature' AND mydb.measurement.value >= (SELECT AVG(mydb.measurement.value) FROM mydb.measurement WHERE mydb.measurement.property = 'temperature' GROUP BY DATE(mydb.measurement.datetime) HAVING DATE(mydb.measurement.datetime) = '2010-01-21'); Query 4INSERT INTO property VALUE('visibility','m'); INSERT INTO installedsensor VALUE(GeomFromText('POINT(0 0)'),'visibility'); INSERT INTO measurement VALUE(GeomFromText('POINT(0 0)'),'visibility','2010-01-21 12:00:00',20); Bonus QuerySELECT COUNT(*) FROM mydb.measurement mRain, mydb.measurement mPressure WHERE mRain.property = 'rain' AND mRain.value > 0 AND mPressure.property = 'pressure' AND mPressure.value = 12 AND mRain.dateTime = mPressure.dateTime; SELECT COUNT(*) FROM mydb.measurement mPressure WHERE mPressure.property = 'pressure' AND mPressure.value = 12; In the bonus query, the probability is obtained by dividing the result of the first query by the result of
the second one.
|
