3

私はテーブルを持っておりCandidatesCandidateNameIDYearOfElectionVotes受け取りました。投票数が年々増加しているすべての候補者を取得したいと考えています。

サンプル エントリ:

CandidateId  year                    votes
------------ ----------------------- ----------
p1           2008-01-01 00:00:00     120       
p2           2008-01-01 00:00:00     15        
p3           2008-01-01 00:00:00     18        
p1           2009-01-01 00:00:00     115       
p2           2009-01-01 00:00:00     20        
p3           2009-01-01 00:00:00     20        
p1           2010-01-01 00:00:00     125       
p2           2010-01-01 00:00:00     19        
p3           2010-01-01 00:00:00     21   

出力例:

CandidateID
--------------
p3

私がまだ試したこと:

でグループ化してcandidateIDから、年で並べ替えてみました。候補のエントリを比較する方法がわかりません。持つことと何か関係がありますか?データベースのクエリは初めてです。

4

2 に答える 2

2

これを試して

CREATE TABLE #Candidates
    ([CandidateId] varchar(12), [year] DATETIME, [votes] INT)
;

INSERT INTO #Candidates
    ([CandidateId], [year], [votes])
VALUES
    ('p1', '2008-01-01 00:00:00', '120'),
    ('p2', '2008-01-01 00:00:00', '15'),
    ('p3', '2008-01-01 00:00:00', '18'),
    ('p1', '2009-01-01 00:00:00', '115'),
    ('p2', '2009-01-01 00:00:00', '20'),
    ('p3', '2009-01-01 00:00:00', '20'),
    ('p1', '2010-01-01 00:00:00', '125'),
    ('p2', '2010-01-01 00:00:00', '19'),
    ('p3', '2010-01-01 00:00:00', '21')
;

SELECT [CandidateId] FROM #Candidates
WHERE [CandidateId] NOT IN 
(
    SELECT T1.[CandidateId] FROM #Candidates T1
    INNER JOIN #Candidates T2 ON T2.[CandidateId] = T1.[CandidateId] 
    AND T1.[YEAR] > T2.[YEAR] AND T1.votes < T2.votes
)
GROUP BY [CandidateId]

DROP TABLE #Candidates
于 2013-07-19T07:17:34.060 に答える
1

次を使用してそれを行うことができますnot exists

   select candidateId from candidates c
   where not exists 
   (
    select 1 
    from candidates 
    where candidateId = c.candidateId and year < c.year and votes > c.votes
   ) 
   group by candidateId 
   having count(*) = 
   (select count(*) from candidates where candidateId = c.candidateId)

SQL フィドル

于 2013-07-19T06:31:10.223 に答える