2017-07-03 46 views
-1

沒有找到一個解決方案尚未... ;-)顯示結果只能查詢有超過2個安打

想這是一個查詢的結果:

ID, SUBS, DATE . 
19967,142, 2017-06-15 . 
20214,147, 2017-05-09 . 
20214,137, 2017-06-07 . 
20303,147, 2017-05-31 . 

,我想只有記錄與身份證誰是更多的1次結果,但我確實需要2個或更多的記錄,所以不是GROUP BY。

如何操作查詢?

+1

什麼查詢?除了一些未格式化的結果,你還沒有展示任何東西。 (我格式化它,但仍然 - 不知道你在問什麼) –

+0

我很抱歉不真的不熟悉這裏的格式,希望這是beter ...對不起 –

+0

理想情況下,這樣的querstion將包括一個SQL小提琴或與樣本數據和查詢相當。就目前而言,我們無法向您顯示針對數據的實際查詢,而沒有實質上構成表和查詢。 –

回答

0

您可以使用exists,假設日期是不同的:

select t.* 
from t 
where exists (select 1 
       from t t2 
       where t2.id = t.id and t2.date <> t.date 
      ); 

基於問題的背景下,我解讀「兩多」實際上是「2或更大」。否則,聚合將是必要的。

+0

我想知道這可能比列舉不同的那個更快。不確定日期比較或計數(我的答案)會更有效率。 –

+0

你可以嘗試兩個比較,但這應該更快與索引'T(ID,日期)'。 –

0

您必須在2個步驟中完成 - 一個用於確定哪些ID具有倍數,另一個用於選擇它們。

有很多方法可以做到這一點;在這個版本中,具有倍數的ID被計數,然後分開選擇數據。

在我(過時的)經驗中,大型IN集可能會非常慢。如果這個列表變得非常龐大,那麼使用臨時表來存儲結果以便它們可以被編入索引是有意義的。無論如何,id上的索引似乎只能提供幫助。

select t.* from t where t.id in (select id, count(*) c from t having c > 1)

-1

創建一個表,它顯示了一個名爲sumRecords記錄的出現次數,並留下參加與約束sumRecords作爲WHERE occurrence > 1

我是指你的表作爲temp下面是代碼:

SELECT temp.* FROM 
temp LEFT JOIN 
(SELECT ID, COUNT(*) occurance 
FROM temp 
GROUP BY ID) sumRecords ON temp.ID = sumRecords.ID 
WHERE sumRecords.occurance > 1 

結果:

ID  subs  dat 
20214 147  2017-05-09 
20214 137  2017-06-07 
0

SELECT * FROM test WHERE id IN (SELECT id FROM test GROUP BY id HAVING COUNT(id) > 1);