在我们的组织中,实现某些目标的会员可以获得不同的奖励。 管理层希望认可今年有史以来第一次获得某些奖项的会员,而不是今年可能再获得一定奖项的会员。我们不能只选择那些赢得任何类型奖项的人,因为他们今年可能获得了两个或更多奖项(有史以来第一次)。
我尝试了各种方法,但它们都匹配太多成员。一个简单的程序语言搜索可以从今年获得一个或多个指定奖项的所有成员开始,然后拒绝那些在过去一年中获得任何奖项的成员,但我无法提出SQL来做到这一点。
奖项表大约有400,000条记录,其中包括:奖项,奖项,会员名称。
答案 0 :(得分:1)
只是头脑风暴,但也许这样的事情会起作用吗?
SELECT `Membername` FROM `award_table` WHERE (YEAR(awarddate) = 2012) && (`Membername` NOT IN (SELECT `Membername` FROM `award_table` WHERE (`awarddate` BETWEEN `1950-01-01` AND `2011-12-31`))
编辑:重新阅读并看到你有400k行...这种方式可能太资源了。
答案 1 :(得分:1)
您可能会做一些涉及WHERE NOT EXISTS
子句和子查询的事情,这些子查询在前几年中寻找匹配的奖励,但是在不了解您的数据库架构的情况下很难提供具体的答案。
另一种可能性:GROUP BY
标识奖励的列,获取每个组的min(awarddate)
,并在HAVING
子句中过滤掉今年之前的值。
答案 2 :(得分:0)
这似乎有效:
SELECT DISTINCT memberName FROM awards WHERE YEAR(awardDate) = '2012' AND (memberName NOT IN (SELECT memberName FROM awards WHERE (YEAR(awardDate) < '2012')))