2017-04-10 19 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'; 
相关问题