2013-08-22 62 views
0

我在SQL中是全新的。我正在處理一個只能從表中返回特定行的查詢。 (請參閱下面的示例源表和所需的輸出)。有人能幫我弄清楚這個嗎?我已經嘗試通過遍歷行來搜索相關主題,但未能找到我所尋找的答案。謝謝。如何返回符合特定條件的特定行

樣品表

Machine Station Defect Code CreateTime 
1   LU  f1   8/20/2013 7:07 
1   LU  f2   8/20/2013 7:07 
1   SLC  d1   8/20/2013 7:08 
1   SLC  d2   8/20/2013 7:09 
1   SLC  d3   8/20/2013 7:10 
1   SLC  d1   8/20/2013 7:10 
1   SLC  d2   8/20/2013 7:11 
1   SLC  d1   8/20/2013 7:17 
1   SLC  d1   8/20/2013 7:20 
1   UL  f3   8/20/2013 7:26 
1   UL  f4   8/20/2013 7:26 
1   UL  f3   8/20/2013 7:26 
1   UL  f4   8/20/2013 7:26 
2   LU  f2   8/20/2013 7:29 
2   SLC  d1   8/20/2013 7:31 
2   SLC  d1   8/20/2013 7:38 
2   SLC  d2   8/20/2013 7:38 
2   SLC  d3   8/20/2013 7:39 
2   SLC  d2   8/20/2013 7:39 
2   SLC  d4   8/20/2013 7:39 
2   SLC  d5   8/20/2013 7:42 
2   SLC  d1   8/20/2013 7:43 
2   SLC  d1   8/20/2013 7:52 
2   SLC  d1   8/20/2013 7:53 
2   SLC  d2   8/20/2013 7:53 
2   SLC  d2   8/20/2013 7:54 
2   SLC  d4   8/20/2013 7:55 
2   SLC  d5   8/20/2013 7:56 

所需結果:

OCAP觸發MACHINE1。 d1多次發生

Machine Station Defect Code CreateTime 
1  SLC  d1   8/20/2013 7:08 
1  SLC  d1   8/20/2013 7:10 
1  SLC  d1   8/20/2013 7:17 
1  SLC  d1   8/20/2013 7:20 

在機器上觸發的OCAP1。 D1連續occurence

Machine Station Defect Code CreateTime 
1  SLC  d1   8/20/2013 7:17 
1  SLC  d1   8/20/2013 7:20 

OCAP觸發機2 D1連續occurence

Machine Station Defect Code CreateTime 
2  SLC  d1   8/20/2013 7:31 
2  SLC  d1   8/20/2013 7:38 

OCAP觸發機2 D2多個occurence

Machine Station Defect Code CreateTime 
2  SLC  d2   8/20/2013 7:38 
2  SLC  d2   8/20/2013 7:39 
2  SLC  d2   8/20/2013 7:53 
+0

你的要求做的一些修正,僅可以使用存儲過程,如果你想這樣做的SQL水平得到滿足。在這種方式下,我不能給出任何有用的代碼,因爲我沒有那麼有經驗。但同樣的事情可以通過編寫一些代碼在php或.net或java或任何其他SQL支持的語言,無論你最熟悉的。 –

+2

@TolgaEvcimen我不明白你爲什麼不能用SQL來做到這一點。此外,我更新了我的答案與SQL小提琴示例(和一些修復基於該查詢) – Sam

回答

1

多次出現將是最容易的。你算多少可以每個組合的查找和選擇那些具有計數大於3

SELECT S.Machine, 
     S.Station, 
     S.DefectCode, 
     S.CreateTime 
FROM (SELECT Machine, 
       Station, 
       DefectCode, 
       CreateTime, 
       COUNT(CreateTime) OVER (PARTITION BY Machine, Station, DefectCode) AS DefectCount 
     FROM SAMPLE 
     WHERE Machine = :machine) S 
WHERE S.DefectCount > 3 

連續發生難度有點困難(下面的查詢可能不是最優化的一個)。假設連續爲「連續的日期」,你可以嘗試以下方法:

WITH OrderedSample 
AS (SELECT Machine, 
      Station, 
      DefectCode, 
      CreateTime, 
      ROW_NUMBER() OVER (ORDER BY CreateTime) AS RowNr 
    FROM SAMPLE 
    WHERE Machine = :machine) 

SELECT Current.Machine, 
     Current.Station, 
     Current.DefectCode, 
     Current.CreateTime 
FROM OrderedSample Current 
WHERE EXISTS (SELECT 1 
       FROM OrderedSample Next 
       WHERE Current.Machine = Next.Machine 
       AND Current.Station = Next.Station 
       AND Current.DefectCode = Next.DefectCode 
       AND Current.RowNr = Next.RowNr - 1) 
OR EXISTS (SELECT 1 
       FROM OrderedSample Prev 
       WHERE Current.Machine = Prev.Machine 
       AND Current.Station = Prev.Station 
       AND Current.DefectCode = Prev.DefectCode 
       AND Current.RowNr = Prev.RowNr + 1) 

編輯

就實現了第二個查詢變得更容易一點,因爲你是用一個固定的機工作:

WITH OrderedSample 
AS (SELECT Machine, 
      Station, 
      DefectCode, 
      CreateTime, 
      ROW_NUMBER() OVER (ORDER BY CreateTime) AS RowNr 
    FROM SAMPLE 
    WHERE Machine = :machine) 

SELECT Curr.Machine, 
     Curr.Station, 
     Curr.DefectCode, 
     Curr.CreateTime, RowNr 
FROM OrderedSample Curr 
WHERE EXISTS (SELECT 1 
       FROM OrderedSample Next 
       WHERE Curr.Station = Next.Station 
       AND Curr.DefectCode = Next.DefectCode 
       AND Curr.RowNr = Next.RowNr - 1) 
OR EXISTS (SELECT 1 
       FROM OrderedSample Prev 
       WHERE Curr.Station = Prev.Station 
       AND Curr.DefectCode = Prev.DefectCode 
       AND Curr.RowNr = Prev.RowNr + 1) 

編輯2:剛注意到機器&站是兩列,編輯

編輯3:基於Sql Fiddle example

+0

謝謝山姆!這段代碼很棒。但有沒有辦法列舉機器號碼?因爲如果我有100臺機器,我必須粘貼代碼100次。還要如何將它放在電子郵件正文中與上述預期結果完全一致? 「在機器1上觸發的OCAP。d1連續發生」,然後是該機器的查詢結果。有可能使用數據庫郵件嗎?我讀過查詢結果可以包含在電子郵件正文中,但無法完全弄清楚如何去做。希望你能幫我解決問題。謝謝! – L42

+0

@ L42如果您對一張表中的所有內容感到滿意,那麼對於多次出現的問題,您只需要移除機器上的「WHERE」,對於連續發生的情況也是如此(但將兩個示例中的第一個作爲你現在需要加入Machine以及你的'EXISTS')。如果你想爲每個Machine/DefectCode組合單獨列表,事情會變得複雜得多,因爲你需要以某種方式循環(無論是在應用程序還是在Tolga評論的存儲過程中)。我不熟悉數據庫郵件,所以不知道如何處理。 – Sam

+0

是一個表中的列表將做,但我必須輸出關於什麼特定機器和OCAP被觸發哪些特定缺陷的評論,這仍將使事情複雜化(當重複發生某個缺陷時,這將作爲警報通知)。順便說一句,不用擔心數據庫郵件的人。你用這些代碼幫助我已經足夠多了。 – L42

相關問題