-1

在我们的组织中,达到特定目标的成员可以获得不同的奖励。管理层希望表彰今年首次获得某些奖项的会员,而不是今年可能再次获得特定奖项的会员。我们不能只选择那些只获得任何类型奖项的人,因为他们今年可能获得了两个或更多奖项(有史以来第一次)。

我尝试了各种方法,但它们都匹配了太多的成员。一个简单的程序语言搜索可能会从今年获得一个或多个指定奖项的所有成员开始,然后拒绝在任何前一年获得任何奖项的成员,但我无法想出 SQL 来做到这一点。

Awards Table 大约有 400K 条记录,列有:award、awarddate、Membername。

4

3 回答 3

1

只是头脑风暴,但也许这样的事情会奏效?

选择“会员名”
来自`award_table`
WHERE (YEAR(awarddate) = 2012) &&
      (`Membername` NOT IN (SELECT `Membername`
                            来自`award_table`
                            WHERE (`awarddate` BETWEEN `1950-01-01` AND `2011-12-31`))

编辑:只需重新阅读并看到您有 400k 行......这种方式可能过于资源昂贵。

于 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 回答