2

データ:

Name | Score | Date
==
John | 10 | 09/01/2012
John | 20 | 09/01/2012
John | 5 | 09/01/2012
Frank | 20 | 11/01/2012

毎日から最高のスコアのみを取得するSQLステートメントを実行したいので、1つの日付から3つのスコアだけを取得するのではなく、最高のスコアのみを取得します。したがって、SQLからのリターンは次のようになります。

John  | 20 | 09/01/2012    
Frank | 20 | 11/01/2012

SQLを介してこれを行うことは可能ですか?現在、日付を確認してすべてをプルした後に行うことができます。しかし、DBから直接それを行うことができれば素晴らしいでしょう。

私はいくつかの解決策を試しましたが、日付とスコアが明確ではないため、最高のものが欲しいので、どこに進むべきかわかりません。SQLはMSAccessデータベースで使用されています。

4

2 に答える 2

3

これが完全な例です。私はOracleでそれを行ったので、Accessの構文を少し調整する必要があるかもしれません。

CREATE TABLE tbl1 (NAME VARCHAR2(100), score INT, Dt DATE);

INSERT INTO tbl1 VALUES ('John',10,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('John',20,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('John',5,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('Harry',15,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('Frank',20,to_date('20121101','YYYYMMDD'));


select a.dt
     , b.name
     , a.score
  FROM (SELECT dt
             , MAX(score) score
          FROM tbl1
       GROUP BY dt) a
     , (SELECT NAME
             , dt
             , MAX(score) score
          FROM tbl1
       GROUP BY name, dt) b
  WHERE a.dt = b.dt
    AND a.score = b.score       

出力:

1   11/1/2012   Frank   20
2   9/1/2012    John    20

2人が特定の日に最高のスコアを持っている場合、両方を印刷することに注意してください。例えば:

INSERT INTO tbl1 VALUES ('John',10,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('John',20,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('John',5,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('Harry',20,to_date('20120901','YYYYMMDD'));
INSERT INTO tbl1 VALUES ('Frank',20,to_date('20121101','YYYYMMDD'));


select a.dt
     , b.name
     , a.score
  FROM (SELECT dt
             , MAX(score) score
          FROM tbl1
       GROUP BY dt) a
     , (SELECT NAME
             , dt
             , MAX(score) score
          FROM tbl1
       GROUP BY name, dt) b
  WHERE a.dt = b.dt
    AND a.score = b.score       

出力:

    DT          NAME    SCORE
1   11/1/2012   Frank   20
2   9/1/2012    John    20
3   9/1/2012    Harry   20
于 2012-04-19T14:18:53.347 に答える
2

とても簡単だと思います

Select [Name], max([score]) as Score, [Date] from scoresTable
   group by [Date], [Name]

編集:

より正確ですが、少し複雑です

select o.[Name], i.[Date], i.Score from scoresTable o
inner join (select [Date], max(Score) as Score
   from scoresTable group by [Date]) as i
on o.[Date] = i.[Date] and i.Score = o.Score

さらに、日付フィールドに時間が含まれている場合

select o.[Name], i.[Date], i.Score from scoresTable o
inner join (select convert(varchar, [Date], 101) as Date, max(Score) as Score
  from scoresTable
    group by convert(varchar, [Date], 101)) as i
on convert(varchar, o.[Date], 101) = i.[Date] and i.Score = o.Score
于 2012-04-19T14:19:20.657 に答える