2017-04-10 36 views
1

我有一個單詞部分的數據庫,每個單詞有兩行。所以基本上每個單詞都有兩行的數據集。我想找到以元音結尾的單詞(以便以後刪除它們)。下面是一個例子行:查找與屬於集合的兩行中的第二行相匹配的記錄

ID  wordID Segment SegType 

2475 1170 d  consonant 
2476 1170 i  vowel 
2477 1171 a  vowel 
2578 1171 d  consonant 

前兩個是一個糟糕的數據集(1170 wordID的) - 這些我想找到,之後再刪除。最後兩個是一個很好的數據集(wordID 1171),我想保留這些數據集。要做到這一點,最簡單的方法是獲取wordID的列表,然後使用它們刪除不良集。

那麼我該如何選擇每個以元音結尾的集合(也就是說集合中兩行的第二行的值爲vowel)呢?第二部分的ID始終高於第一部分,但不是可靠的奇數或偶數(我已經嘗試過使用該查詢了)。

+0

前兩個是壞手段..你是在談論1170? – Teja

+0

是的,我澄清了我的問題。 – rayne

+0

你想消除重複?什麼定義了「壞」wordID? –

回答

1

如果我理解正確的話,你可以使用GROUP BYHAVING

select wordId 
from t 
group by wordId 
having max(case when segtype = 'vowel' then id end) = max(id) 

having條款發現該行的id與元音區間爲每wordID的and the maximum ID for each的wordID . A wordId`是結果如果這些ID相同則設置。

+0

按照預期完美工作,謝謝! – rayne

0

嘗試以下查詢:

SELECT a.wordID 
FROM words a JOIN words b ON a.wordID = b.wordID 
WHERE a.ID > b.ID and a.segType = 'vowel'; 

這基本上執行在wordIDSELF JOIN並返回所有具有高於價值的IDS他們參加對口和「元音」作爲segType。

0

w2查詢 - 此查詢通過在wordID上分組返回每個數據集的最後一個值。

將w2與wordID上的原始表w1(單詞)結合起來,並根據上述w2查詢計算出的最後一個值進行過濾。

SELECT w1.* 
    FROM words w1 
INNER JOIN 
(
SELECT wordID,LAST_VALUE(SegType) OVER(PARTITION BY wordID ORDER BY id) AS lv 
    FROM words 
GROUP BY wordID 
) w2 
ON w1.wordID = w2.wordID 
WHERE w2.lv = 'vowel'; 
相關問題