沒有找到一個解決方案尚未... ;-)顯示結果只能查詢有超過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。
如何操作查詢?
沒有找到一個解決方案尚未... ;-)顯示結果只能查詢有超過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。
如何操作查詢?
您可以使用exists
,假設日期是不同的:
select t.*
from t
where exists (select 1
from t t2
where t2.id = t.id and t2.date <> t.date
);
基於問題的背景下,我解讀「兩多」實際上是「2或更大」。否則,聚合將是必要的。
我想知道這可能比列舉不同的那個更快。不確定日期比較或計數(我的答案)會更有效率。 –
你可以嘗試兩個比較,但這應該更快與索引'T(ID,日期)'。 –
您必須在2個步驟中完成 - 一個用於確定哪些ID具有倍數,另一個用於選擇它們。
有很多方法可以做到這一點;在這個版本中,具有倍數的ID被計數,然後分開選擇數據。
在我(過時的)經驗中,大型IN
集可能會非常慢。如果這個列表變得非常龐大,那麼使用臨時表來存儲結果以便它們可以被編入索引是有意義的。無論如何,id
上的索引似乎只能提供幫助。
select t.* from t where t.id in (select id, count(*) c from t having c > 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
SELECT * FROM test WHERE id IN (SELECT id FROM test GROUP BY id HAVING COUNT(id) > 1);
什麼查詢?除了一些未格式化的結果,你還沒有展示任何東西。 (我格式化它,但仍然 - 不知道你在問什麼) –
我很抱歉不真的不熟悉這裏的格式,希望這是beter ...對不起 –
理想情況下,這樣的querstion將包括一個SQL小提琴或與樣本數據和查詢相當。就目前而言,我們無法向您顯示針對數據的實際查詢,而沒有實質上構成表和查詢。 –