2012-12-26 35 views
1

得到最後一組重複的記錄,我有以下表格:SQL查詢到一些條件

enter image description here

我試圖找到一種方式來獲得那些已經過期的客戶記錄,然後相應地更新表(通過更新,我的意思是用相關客戶的customer_id添加條目'SERVICE EXPIRED'的新記錄)。

如果您查看錶格的底部,您會注意到已有客戶(customer_id 11和16)中有兩條記錄「SERVICE EXPIRED」。

我正在尋找一個SQL查詢,將:

  1. 通過CUSTOMER_ID獲取最後一組不同的記錄
  2. 排除記錄,從所得到的結果集有條目相同CUSTOMER_ID「服務過期'或2 STATUS_ID後來出現在表格

如果我使用以下命令:

SELECT MAX(id) FROM mytable WHERE status_id != '2' AND expiry < '2012-12-26 19:00:00' GROUP BY customer_id 

它將返回ID11,11和16.但是,我不希望id 11和16,因爲到期狀態已經在表中的後面註明(請參閱表的最後兩條記錄),並且ID 1已經被更新,因爲可以在隨後的ID 3中看到更新的到期日期。我想要的是ID 13,因爲這是唯一沒有過期記錄,沒有「表過期」的「SERVICE EXPIRED」條目。

我正在尋找一個SQL查詢,這將使我能夠捕獲此需求。

在此先感謝

+0

有沒有機會創建SQL小提琴或將現有數據粘貼爲複製友好格式?我有一個可能的答案,但我想測試它。 – ExactaBox

+0

@ExactaBox我設法找到一種方法來拉它。乾杯。 –

回答

1

一些擺弄周圍後我設法拿出一個解決方案:

SELECT MAX(id) 
FROM mytable 
WHERE status_id != '2' 
    AND expiry < '2012-12-26 19:00:00' 
    AND customer_id NOT IN (SELECT MAX(customer_id) FROM mytable WHERE status_id = '2' GROUP BY customer_id) 
GROUP BY customer_id 

感謝@ JupiterP5指着我在正確的方向。

Regards,

0

它效率不高,但這應該工作。

SELECT MAX(id) 
FROM mytable 
WHERE status_id != '2' 
    AND expiry < '2012-12-26 19:00:00' 
    AND id NOT IN (SELECT id FROM mytable where status_id = 2) 
GROUP BY customer_id 

編輯:錯過了服務更新的情況。如果我想到某件事,我會更新。

+0

謝謝。我用這個來得到我需要的東西。非常感激。 –

+0

很高興我能幫到你。 – JupiterP5

0

您的要求相當於在記錄上次到期後查找「n」個記錄。下面的查詢給定客戶的最後期限屆滿後返回所有記錄:

select t.* 
from t join 
    (select t.customer_id, MAX(id) as maxid 
     from t 
     where status_id = 2 
    ) texp 
    on t.customer_id = texp.customer_id and 
     t.id > texp.maxid 

通過使用變量巧妙,可以列舉這些以獲得最後的「N」。但是,你真的需要一個固定的數字嗎?爲什麼不是所有的人?爲什麼不只是其中之一?