>>>> 2012/09/18 06:53 -0400, Larry Martell >>>> This works fine. But now I need to get a certain column (image_measurer_id) with each row returned that corresponds to the row from the group that has bottom = Min(bottom), bottom = Max(bottom), bottom closest to Avg(bottom), and bottom from the row where date_time = Max(date_time). <<<<<<<< There is a standard and ugly way of getting such a thing, but it entails repeating the table reference (supposing you want any, not every, to match):
SELECT data_cst.target_name_id, image_measurer_id, nb, xb, vb, xt, bottom FROM (SELECT Min(bottom) AS nb, Max(bottom) AS xb, MIN(ABS(Avg(bottom) - bottom)) AS vb, Max(date_time) AS xt FROM data_cst WHERE target_name_id IN (775, 776, 777, 778, 779, 780, 45, 44, 116, 117, 118, 119, 120, 121) AND DATE(data_cst.date_time) = '2010-03-04' GROUP BY target_name_id, ep, wafer_id HAVING count(*) < 999) AS st JOIN data_cst ON st.target_name_id = data_cst.target_name_id AND (nb = bottom OR xb = bottom OR vb = bottom OR date_time = xt) One record will be returned for every row that holds a relevant extremum, not guaranteed to be unique. This query pertains only to your original subquery, not the whole query. To get the result to which you refer, join this to your original query, to which you have added something like vb: SELECT * FROM (original query) JOIN (this query) ON nb = minbottom AND xb = maxbottom AND xt = "Last Run" AND vb = .... AND (original query).target_name_id = (this_query).target_name_id --but I am not confident in the result. There are problems in the original query, the biggest that of avgbottom, stdbottom, maxbottom, minbottom none are aggregated over wafer_id. Therefore, it is not certain from which record from q1 they are returned. MySQL tends to pick the first that fits, but not only is nothing guaranteed, it is explicitly written that if such not aggregated fields appear, the output is not determinate unless all pertinent are equal, the possibility wherof the reason for allowing it. When that has been handled, it is needful to change the foregoing query to match that one in two levels, because averaging is not associative (there is also the problem of equality-testing on generated floating-point numbers). If it were only MAX and MIN, one level of not GROUPing BY wafer_id would be all right. By the way, in the original query, I suggest instead of data_cst.date_time BETWEEN '2010-03-04 00:00:00' AND '2010-03-04 23:59:59' this, DATE(data_cst.date_time) = '2010-03-04' Instead of ... q1, data_target WHERE data_target.id = target_name_id this would be better: ... q1 JOIN data_target ON data_target.id = target_name_id I believe that 100-((SUM(numonep) - SUM(numbottoms))/SUM(numonep)*100) = 100*SUM(numbottoms)/SUM(numonep) and SUM(CASE WHEN reruns > 0 THEN reruns ELSE 0 END) = SUM(GREATEST(reruns, 0)) -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/mysql