这个有点棘手,我希望我能在这个问题上明确自己,因为这不是很常见的问题(或者可能是?)。
我有一个表有这样的重复记录(我说的是数百个):
| Code|Route|State|City|Start| End|Style|
|-----------------------------------------|
| R14| 14| NL| MTY| Ind|Main| High|
| R14-01| 14| NL| MTY| Ind|Main| High|
| R15-1| 15| NL| MTY| Cal| Cle| Low|
| R15B| 15| NL| MTY| Cal| Cle| Low|
| R14-2| 14| NL| MTY| Ind|Main| High|
| RT15th| 15| NL| MTY| Cal| Cle| High|
| RT15°| 15| NL| MTY| Cal| Cle| High|
| R15.3| 15| NL| MTY| Cal| Cle| Low|
| RT15/H| 15| NL| MTY| Cal| Cle| High|
我需要得到这样的答案:
| Code|Route|State|City|Start| End|Style|
|---------------------------------------|
| R14| 14| NL| MTY| Ind|Main| High|
| R15| 15| NL| MTY| Cal| Cle| Low|
| RT15| 15| NL| MTY| Cal| Cle| High|
我已经创建了一个查询,按路径,状态,城市,开始,结束和样式对结果进行分组;这是非常容易的部分。
SELECT DISTINCT Route, State, City, Start, End, Style FROM Routes;
如果您可以看到Code列是唯一导致问题的列。我需要通过类似的代码对该列进行分组(交叉字符及其位置R14,R14-01,R14-2 => R14和R15-1,R15-2 => R15-和R15,R15-1 => R15)
知道我怎么能得到那些交叉点?
为了澄清列代码是一团糟,有很多字符用作限制器。表格不是那么简短,我说的是数千条记录,其中一些记录存在这个问题。我把桌子扩大了一点,这样你就能更好地了解我想要完成的事情。
你可以做:
select (case when code in ('R14', 'R14-01', 'R14-2') then 'R14'
when code in ('R15-1', 'R15-2') then 'R15-'
when code in ('R15', 'R15-1') then 'R15'
else code
end) as newcode, Route, State, City, Start, End, Style
from t
group by newcode, Route, State, City, Start, End, Style;
我注意到R15-1
分为两类。
与戈登的答案相同的一般观点,细节略有不同。
select distinct case
when code like '%-' then code -- ends in hyphen
else substr(code, 1, 3) end thecode
, etc