-1

私たちの組織では、特定の目標を達成したメンバーはさまざまな賞を獲得できます。経営陣は、今年も特定の賞を受賞した可能性のあるメンバーとは対照的に、今年初めて特定の賞を受賞したメンバーを表彰したいと考えています。今年は(初めて)2つ以上の賞を受賞した可能性があるため、どのタイプの賞も1つだけ受賞した人だけを選択することはできません。

私はさまざまなアプローチを試しましたが、それらはすべてあまりにも多くのメンバーに一致します。単純な手続き型言語検索は、今年1つ以上の特定の賞を獲得したすべてのメンバーから開始し、前の年にいずれかの賞を獲得したメンバーを拒否する場合がありますが、SQLを思い付くことができません。

アワードテーブルは約400Kレコードで、列はアワード、アワード日付、メンバー名です。

4

3 に答える 3

1

ブレーンストーミングだけですが、おそらくこのようなものでうまくいくでしょうか?

SELECT`メンバー名`
FROM `award_table`
WHERE(YEAR(awarddate)= 2012)&&
      (`メンバー名`NOT IN(SELECT`メンバー名`
                            FROM `award_table`
                            WHERE( `awarddate` BETWEEN` 1950-01-01` AND `2011-12-31`))

編集:もう一度読んで、40万行あることを確認してください...この方法では、リソースが高すぎる可能性があります。

于 2012-06-22T01:59:32.427 に答える
1

WHERE NOT EXISTSおそらく、前の年に一致する賞を探す句とサブクエリを含む何かを行うことができますが、データベーススキーマについて詳しく知らなければ、特定の答えを提供することは困難です。

別の可能性: 賞を識別し、各グループを取得し、条項内の今年より前の値をGROUP BY除外する列。min(awarddate)HAVING

于 2012-06-22T02:00:37.690 に答える
0

これはうまくいくようです:

SELECT DISTINCT memberName FROM awards WHERE YEAR(awardDate) = '2012' AND (memberName NOT IN (SELECT memberName FROM awards WHERE (YEAR(awardDate) < '2012')))
于 2012-06-22T02:06:19.037 に答える