I’ve got a big problem with this complicated SQL. Could anyone give me a hand?
My first aim(not the final goal) is:fliter the duplicate data with query statment( select not delete) , that is, the various entries of EndTime and Qos for a same ServiceID due to the repeated feedback. The rule is to only keep the records with the lowest Qos for a same ServiceID. If there are several records having the lowest Qos, then only keep whatever one of these records. The client accepts and prefers to this scheme. In this example, for the ID=6,7, and 8, just keep 6 or 7.I have got answer of this aim here:
aim2: Qos=1 represents the Satisfied Service. The monthly total Satisfied Services achieved by each technical support engineer is referred to as “Personal Total Satisfied Services this Month”. Those technical support engineers whose “Personal Total Satisfied Service this Month” ranking among the top 2 in that month are referred to as the “Top 2 since this Month”. If they are outstanding enough to be entitled to the “Top 2 since this Month” every month, then they can be referred to as “Outstandi ng of Class 1”. All in all, this step is to compute the “Outstandi ng of Class 1”. In this example, “Top 2 since this Month” for January is Andrew and Jacob, and that for February are Andrew, Dlyan, and Jacob. Therefore, the honor title of “Outstandi ng of Class 1” is awarded to Andrew and Jacob.
please help me with aim2 (finally I should reach the aim 4, the final goal), result of aim 2 should be
explain:There are some technical service data (ServiceID, TCID, EndTime, and QoS) in a whole year, and field ID is a unique primary key because there are some duplicates.
some data:
Data Structure:
DDL and insert SQL(mysql5):
Almost forget to say that, just a reminder, the client only accept the SQL instead of stored procedure in database to implement it. And I only need query statement because customer did not allow us to write database.
this is my first 2 aims, there are 2 more, I am intended to complete all these steps one after another. Could anyone help achieve the first goal? I know it is quite complicated and many thanks to you in advance.
aim3:Then, to compute the “Outstandi ng of Class 2” (the engineers of “Top 2 since this Month” are not included) equals to compute those ranking the third and the forth places. In this example, the “Outstandi ng of Class 2” is the Tyler.
aim4:The final goal is to combine the “Outstandi ng of Class 1” with “Outstandi ng of Class 2”. The result will be ultimately transferred to report for rendering. My dataSet is just like:
My first aim(not the final goal) is:fliter the duplicate data with query statment( select not delete) , that is, the various entries of EndTime and Qos for a same ServiceID due to the repeated feedback. The rule is to only keep the records with the lowest Qos for a same ServiceID. If there are several records having the lowest Qos, then only keep whatever one of these records. The client accepts and prefers to this scheme. In this example, for the ID=6,7, and 8, just keep 6 or 7.I have got answer of this aim here:
Code:
SELECT DISTINCT serviceid,tcid,endtime,qos FROM (SELECT * FROM service ORDER BY serviceid, qos, id) AS base GROUP BY serviceid
please help me with aim2 (finally I should reach the aim 4, the final goal), result of aim 2 should be
Code:
TCID Andrew Jacob
some data:
Code:
ServiceID ID TCID EndTime Qos 2000 2 Jacob 2011/1/1 2 2000 3 Jacob 2011/1/1 2 2001 4 Jacob 2011/1/1 2 2002 5 Jacob 2011/2/3 1 2003 6 Tyler 2011/1/4 1
Code:
ID: Unique primary key of record ServiceID: ID of a certain service TCID: ID of a technical support engineer EndTime: Ending Time of aservice Qos:Quality of service (1 Satisfied; 2 Average; 3Unsatisfactory/Dissatisfied).
Code:
CREATE TABLE `service` ( `ServiceID` INTEGER(11) NOT NULL, `ID` INTEGER(11) NOT NULL , `TCID` VARCHAR(40) NOT NULL, `EndTime` DATE NOT NULL, `Qos` CHAR(1) NOT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `ID` (`ID`) ); COMMIT; INSERT INTO `service` (`ServiceID`, `ID`, `TCID`, `EndTime`, `Qos`) VALUES (2004, 9, 'Jacob', '2011-02-04', '1'), (2000, 2, 'Jacob', '2011-01-01', '2'), (2000, 3, 'Jacob', '2011-01-01', '2'), (2001, 4, 'Jacob', '2011-01-01', '2'), (2002, 5, 'Jacob', '2011-02-03', '1'), (2003, 6, 'Tyler', '2011-01-04', '1'), (2003, 7, 'Tyler', '2011-01-04', '1'), (2003, 8, 'Tyler', '2011-01-03', '2'), (2005, 10, 'Jacob', '2011-02-05', '1'), (2006, 11, 'Jacob', '2011-02-04', '2'), (2007, 12, 'Jacob', '2011-01-08', '1'), (2008, 13, 'Tyler', '2011-02-06', '1'), (2009, 14, 'Dylan', '2011-02-08', '1'), (2010, 15, 'Dylan', '2011-02-09', '1'), (2014, 16, 'Andrew', '2011-01-01', '1'), (2013, 17, 'Andrew', '2011-01-01', '1'), (2012, 18, 'Andrew', '2011-02-19', '1'), (2011, 19, 'Andrew', '2011-02-02', '1'), (2015, 20, 'Andrew', '2011-02-01', '1'), (2016, 21, 'Andrew', '2011-01-19', '1'), (2017, 22, 'Jacob', '2011-01-01', '1'), (2018, 23, 'Dylan', '2011-02-03', '1'), (2019, 24, 'Dylan', '2011-01-09', '1'), (2020, 25, 'Dylan', '2011-01-01', '1'), (2021, 26, 'Andrew', '2011-01-03', '1'), (2021, 27, 'Dylan', '2011-01-11', '1'), (2022, 28, 'Jacob', '2011-01-09', '1'), (2023, 29, 'Tyler', '2011-01-19', '1'), (2024, 30, 'Andrew', '2011-02-01', '1'), (2025, 31, 'Dylan', '2011-02-03', '1'), (2026, 32, 'Jacob', '2011-02-04', '1'), (2027, 33, 'Tyler', '2011-02-09', '1'), (2028, 34, 'Daniel', '2011-01-06', '1'), (2029, 35, 'Daniel', '2011-02-01', '1'); COMMIT;
this is my first 2 aims, there are 2 more, I am intended to complete all these steps one after another. Could anyone help achieve the first goal? I know it is quite complicated and many thanks to you in advance.
aim3:Then, to compute the “Outstandi ng of Class 2” (the engineers of “Top 2 since this Month” are not included) equals to compute those ranking the third and the forth places. In this example, the “Outstandi ng of Class 2” is the Tyler.
aim4:The final goal is to combine the “Outstandi ng of Class 1” with “Outstandi ng of Class 2”. The result will be ultimately transferred to report for rendering. My dataSet is just like:
Code:
TCID level Andrew top2 Jacob top2 Tyler top4
Comment