SQL中的MIN函数无法正常工作

ekeckeisen

我有一张表格,列出了游戏的玩家以及游戏中等级变化的历史(初学者,中级,高级,精英,职业玩家)。我正在尝试建立一个查询,以准确识别2021年迄今为止首次达到高级或更高水平的人(玩家有可能跳过排名,所以我想最早达到他们晋升的日期,精英或专业水平)。我目前正在使用此查询:

SELECT *
FROM (
SELECT p."ID", ra."NewRank", MIN(ra."EffectiveDate") AS "first_time_adv"
FROM rankachievement ra
JOIN player p
ON ra."ID" = p."ID"
WHERE ra."NewRank" IN ('Advanced',
        'Elite',
        'Pro')
GROUP BY 1, 2) AS t
WHERE t."first_time_adv" > '1/1/2021'
ORDER BY 1 

目前,这吸引了所有在2021年首次达到高级水平的人,但是也吸引了一些以前在2020年达到高级水平,现在已经达到更高水平的人-我不不想包括这些人,这就是为什么我在日期中使用MIN。

例如,正确地吸引了分别在1月2日达到高级的玩家1和2,以及在跳过高级级别(从中级直接转到精英)之后于1月4日达到精英的玩家4。但这也吸引了Player 3,后者于2020年12月30日晋升为高级,然后于1月10日晋升为精英。我不希望将Player 3包括在内,因为他们在2021年之前首次晋升。查询以排除这样的人?

斯普拉特

您会获得Player 3的两个结果...一个是高级的,另一个是精英的,因为您要按分组NewRank玩家3进入高级状态的那个将被您WHERE t.first_time_adv > '1/1/2021'和精英通过的结果集中删除我建议尝试使用FILTER,并OVERMIN()

内部查询的结果包括以下内容:

id | new_rank | MIN(EffectiveDate)
---+----------+-------------------
1  | advanced | the min date for this record (12/30/2020)
1  | elite    | the min date for this record (01/10/2021)

这是因为您MIN同时将IDAND和分组NewRank您需要该MIN玩家的全部记录。如果仅按分组,则ID可能会得到您想要的行为,但这将需要NewRankSELECT子句中删除


我怀疑您想要最终结果集中的排名,因此请尝试以下操作:

WITH data AS
(
SELECT p."ID"
     , ra."NewRank"
     , ra."EffectiveDate"
     , MIN(ra."EffectiveDate")
       FILTER (WHERE ra."NewRank" = 'Advanced')
       OVER (PARTITION BY p."ID") AS "first_time_adv"
  FROM rankachievement ra
  JOIN player p ON ra."ID" = p."ID"
 WHERE ra."NewRank" IN ('Advanced', 'Elite', 'Pro')
)
SELECT *
  FROM data d
 WHERE d."first_time_adv" > '1/1/2021'
ORDER BY 1
;

以前你找到了MIN(EffectiveDate)任何rank IN ('Advanced', 'Elite', 'Pro')... ...现在你真正找到了EffectiveDate一个玩家到达for 'Advanced'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章