2012-08-31 161 views
4

我正在嘗試編寫一個包含2個子查詢的查詢。查詢在單獨運行時工作,但是當我將它們放在一起時,我沒有得到所需的結果集。我會盡量給出一個簡單的例子。從子查詢中選擇

主查詢:

mysql> select target_name_id, ep, count(*), count(distinct wafer_id) 
     from data_cst 
     where target_name_id = 155609 
     and data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59' 
     GROUP BY target_name_id, data_cst.ep; 

+----------------+------+----------+--------------------------+ 
| target_name_id | ep | count(*) | count(distinct wafer_id) | 
+----------------+------+----------+--------------------------+ 
|   155609 | Line |  4799 |      215 | 
+----------------+------+----------+--------------------------+ 
1 row in set (0.05 sec) 

第一子查詢:

mysql> SELECT target_name_id,ep, wafer_id, AVG(bottom) as averages, 
     FROM data_cst    
     WHERE target_name_id = 155609 
     AND data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59' 
     GROUP BY target_name_id, ep, wafer_id; 
+----------------+------+----------+------------+ 
| target_name_id | ep | wafer_id | averages | 
+----------------+------+----------+------------+ 
|   155609 | Line | 401739 | 47.6236667 | 
|   155609 | Line | 403041 | 47.3739167 | 
|   155609 | Line | 408339 | 47.4901667 | 
|   155609 | Line | 409683 | 48.3066250 | 
|   155609 | Line | 409690 | 47.2402500 | 
|   155609 | Line | 410249 | 47.3346667 | 
|   155609 | Line | 410633 | 48.7373333 | 
|   155609 | Line | 414000 | 48.1274167 | 
       . 
       . 
       . 
215 rows in set (0.07 sec) 

二子查詢:

mysql> SELECT target_name_id, ep, data_file_id, lot_id, wafer_id, 
       date_time, 
       COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id)-1 as reruns 
     FROM data_cst   
     WHERE target_name_id = 155609 
     AND data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59' 
     GROUP BY target_name_id, data_cst.ep, wafer_id   
     HAVING COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id) > 1; 



    +----------------+------+--------------+--------+----------+---------------------+--------+ 
    | target_name_id | ep | data_file_id | lot_id | wafer_id | date_time   | reruns | 
    +----------------+------+--------------+--------+----------+---------------------+--------+ 
    |   155609 | Line |   774 | 120804 | 403041 | 2012-07-06 03:51:50 |  1 | 
    |   155609 | Line |   6502 | 123109 | 409683 | 2012-07-16 05:10:04 |  1 | 
    |   155609 | Line |   749 | 120804 | 409690 | 2012-07-06 04:08:01 |  1 | 
    |   155609 | Line |  3319148 | 123484 | 410633 | 2012-07-07 09:12:20 |  5 | 
    |   155609 | Line |   8264 | 134609 | 414098 | 2012-07-03 11:34:12 |  5 | 
    |   155609 | Line |  3279867 | 124752 | 414245 | 2012-06-26 00:51:31 |  1 
       . 
       . 
       . 
93 rows in set (0.06 sec) 

現在,當我把它們放在一起我想從主查詢計數,第二個是平均值,第三個是重複列的總和。我一直在搞這個3天,我不能拿出正確的連接來獲得我想要的結果。我已經能夠得到的總和出來的權利,或計數或平均水平,但並非所有3.這是我最新的嘗試:

mysql> select data_cst.target_name_id, data_cst.ep, count(*) as count, 
     count(distinct data_cst.wafer_id) as wafers, 
     avg(averages) as average, sum(reruns) as rerun 
     from data_cst, 
      (SELECT target_name_id,ep, wafer_id, AVG(bottom) as averages    
      FROM data_cst       
      WHERE target_name_id = 155609    
      AND data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59'    
      GROUP BY target_name_id, ep, wafer_id) q1, 
      (SELECT target_name_id, ep, data_file_id, lot_id, wafer_id, 
        date_time, 
        COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id)-1 as reruns 
      FROM data_cst      
      WHERE target_name_id = 155609    
      AND data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59'    
      GROUP BY target_name_id, data_cst.ep, wafer_id      
      HAVING COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id) > 1) r 
     where data_cst.target_name_id = 155609 
     AND data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59' 
     and data_cst.wafer_id = q1.wafer_id 
     GROUP BY target_name_id, data_cst.ep; 
+----------------+------+--------+--------+----------------+--------+ 
| target_name_id | ep | count | wafers | average  | rerun | 
+----------------+------+--------+--------+----------------+--------+ 
|   155609 | Line | 446307 | 215 | 48.12877962148 | 724649 | 
+----------------+------+--------+--------+----------------+--------+ 
1 row in set (23.56 sec) 

有了這個最外層的WHERE子句的枚數和平均值是正確的,但計數和重新運行不是。我可以使用不同的where子句並重新運行正確,但計數和晶圓是錯誤的。我可以使用另一個不同的where子句,並計數正確,但重新運行是錯誤的。

我一直在搞這個3天,我只是找不到適用於我的where子句。

這是一個更新我的問題:

我修改我的查詢由戈登·利諾夫的建議,自那時以來,客戶端還增加了很多新的要求,我已經能夠納入查詢。但是現在他們已經添加了一些我不太明白如何解決這個問題。

我的查詢現在看起來是這樣的:

SELECT data_target.name as Target, 
     q1.ep as EP, 
     COUNT(*) as Wafers, 
     Lots, 
     SUM(numonep)/(COUNT(*)+SUM(CASE WHEN reruns > 0 THEN reruns ELSE 0 END)) as 'Sites/Wafer', 
     MAX(LastRun) as "Last Run", 
     SUM(CASE WHEN reruns > 0 THEN reruns ELSE 0 END) as Rerun, 
     COUNT(*)+SUM(CASE WHEN reruns > 0 THEN reruns ELSE 0 END) as Runs, 
     avgbottom as "Avg Bottom", 
     3*stdbottom as "3 Sig", 
     maxbottom as Max, 
     minbottom as Min, 
     SUM(numonep) as Count, 
     SUM(numonep) - SUM(numbottoms) as NAs, 
     100-((SUM(numonep) - SUM(numbottoms))/SUM(numonep)*100) as "% Success", 
     3*stdbottom/avgbottom as "3Sig/Avg", 
     AVG(avgbottom) as 'Wafer Avg', 
     AVG(Wafer3Sigma) as 'Wafer 3 Sigma', 
     AVG(Ranges) as 'Avg Range', 
     3*STD(Ranges) as '3Sig of Ranges', 
     MAX(Ranges) as 'Max Range', 
     MIN(Ranges) as 'Min Range', 
     (SUM(numonep) - SUM(numbottoms))/COUNT(*) as 'NAs/Wafer' 
    FROM (SELECT target_name_id, 
       ep, 
       wafer_id, 
       COUNT(bottom) as numbottoms, 
       AVG(bottom) as avgbottom, 
       STD(bottom) as stdbottom, 
       MAX(bottom) as maxbottom, 
       MIN(bottom) as minbottom, 
       MAX(date_time) as "LastRun", 
       COUNT(*) as numonep, 
       COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id)-1 as reruns, 
       COUNT(DISTINCT(lot_id)) as Lots, 
       3*STD(bottom) as Wafer3Sigma, 
       MAX(bottom) - MIN(bottom) as Ranges 
     FROM data_cst 
     WHERE target_name_id IN (775, 776, 777, 778, 779, 780, 45, 44, 116, 117, 118, 119, 120, 121) 
     AND data_cst.date_time BETWEEN '2010-03-04 00:00:00' AND '2010-03-04 23:59:59' 
     GROUP BY target_name_id, ep, wafer_id 
     HAVING count(*) < 999) q1, 
    data_target 
    WHERE data_target.id = target_name_id 
    GROUP BY q1.target_name_id, q1.ep; 

這完美的作品。但是現在他們希望我得到一個特定的列(image_measurer_id),每行返回的行對應於組中具有bottom = Min(bottom),bottom = Max(bottom),bottom接近Avg(bottom)的行以及從行的底部where date_time = Max(date_time)。

這甚至有可能從這一個查詢嗎?

+0

您是否看到重新運行得比您期望的要高很多?高出215倍。如果是這樣的話,那麼你的級聯會導致笛卡爾產品 – Yoztastic

+0

是的,但是我怎麼阻止它? –

+0

很好的問題我打算在晶圓上建議一個謂詞Id,但是我看到你有那個 – Yoztastic

回答

3

如果您使用正確的連接語法,它會幫助你很多。連接回data_cst似乎是多餘的。如果你的兩個子查詢具有相同的目標和硅片,然後進行簡單連接或左外連接應該工作:

select q1.target_name_id, q1.ep, count(*) as count, 
    count(distinct q1.wafer_id) as wafers, 
    avg(averages) as average, sum(reruns) as rerun 
    from (SELECT target_name_id,ep, wafer_id, AVG(bottom) as averages    
     FROM data_cst       
     WHERE target_name_id = 155609    
     AND data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59'    
     GROUP BY target_name_id, ep, wafer_id) q1 left outer join 
     (SELECT target_name_id, ep, data_file_id, lot_id, wafer_id, 
       date_time, 
       COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id)-1 as reruns 
     FROM data_cst      
     WHERE target_name_id = 155609    
     AND data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59'    
     GROUP BY target_name_id, data_cst.ep, wafer_id      
     HAVING COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id) > 1 
    ) r 
     on r.wafer_id = q1.wafer_id and 
     r.target_name_id = q1.target_name_id and 
     r.ep = q1.ep 
    GROUP BY q1.target_name_id, q1.ep; 

然而,你的查詢都是非常相似的,所以我覺得你可以簡化邏輯:

select q1.target_name_id, q1.ep, sum(numonep) as count, 
     count(*) as wafers, 
     avg(averages) as average, 
     sum(case when reruns > 0 then reruns else 0 end) as rerun 
from (SELECT target_name_id, ep, wafer_id, AVG(bottom) as averages, 
      count(*) as numonep, 
      COUNT(DISTINCT target_name_id, ep, lot_id, data_file_id)-1 as reruns   
     FROM data_cst       
     WHERE target_name_id = 155609 and    
      data_cst.date_time BETWEEN '2012-06-23 00:00:00' AND '2012-08-23 23:59:59'    
     GROUP BY target_name_id, ep, wafer_id 
    ) q1 
group by q1.target_name_id, q1.ep 
+0

感謝您的回覆。這些查詢沒有給出所需的計數(*) - 我想要4799 - data_cst中的行數,其中target_name_id = 155609和data_cst.date_time BETWEEN'2012-06-23 00:00:00'AND'2012-08-23 23:59:59' - 查看頂部的第一個查詢。您的查詢返回215,與count相同(distinct q1.wafer_id)。您的案例陳述中還缺少一個「結束」。 –

+0

@LarryMartell。 。 。我無法弄清楚爲什麼你有數(*)和數(不同的wafer_id)。分組後,這些將是相同的(除非wafer_id爲NULL)。你想要的是在子查詢中做一筆總和,然後添加這些數字。我修改了查詢以反映這一點。 –

+0

+1來解決這個問題。 – Kermit