2016-12-28 8 views
0

"Majors"という列があり、その列からすべてを取得したいが、最初の文字が重複するものは除外したい。 私はAMSTとADIBを持っていたかのように、それらのうちの1つだけが表示され、不確定になります。個別の先頭文字を取得して、列全体を返す

もしAMST、ADIB、BIOL、CSCI、CENG、EENGがあったら、最終結果はAMST、BIOL、CENG、EENGです。

私は現在持っている:私は、私が欲しいの出力を得ることができる方法についての

DECLARE @VTest table(majName varchar(100)) 

INSERT INTO @VTest (majName) 
SELECT DISTINCT TOP 5 Major FROM MajorTbl ORDER BY Major desc 

--For some reason returns all the rows despite it only giving distincts (Would return AMST and ADIB, even though it should only give one of those and not both) 
SELECT * FROM @VTest 
WHERE SUBSTRING(majName, 1, 1) = 
    (SELECT DISTINCT SUBSTRING(CONVERT(varchar(100), [@VTest].majName), 1, 1) as c) 

任意のアイデア?

+0

あなたの質問には、使用しているデータベース(SQL Serverのようです)にタグを付けてください。 –

+1

もしあなたがAMSTを持っていたら、どの人が最初に現れるべきかをどのように知ることができますか?降順?これは「結果がAMSTであろう」ということです。しかし、後で「CSCI CENG ..」は、CENGが望む結果を持ちます。 – plditallo

+0

他の行を削​​除する理由は、異なる結果があるため、不明です。また、サブクエリを非修飾サブクエリとともに使用することは、うまくスケールされません。 –

答えて

2

あなたは「何か」ごとに1つのだけの行をしたい場合は、row_number()は、問題を解決するための明白な候補のように思える:

select t.* 
from (select t.*, 
      row_number() over (partition by left(majName, 1) order by newid()) as seqnum 
     from @VTest t 
    ) t 
where seqnum = 1; 

(注)この行をランダム化するようなもののためのSQL Serverの規則を使用していること。あなたのコードはSQL Serverコードのようです。

+0

私はこれほど長い間これを続けてきましたが、実際にこれをやってみましたが、LEFTは入れませんでした。 – hanahouhanah

関連する問題