我有一张表格,列出了游戏的玩家以及游戏中等级变化的历史(初学者,中级,高级,精英,职业玩家)。我正在尝试建立一个查询,以准确识别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
,并OVER
用MIN()
。
内部查询的结果包括以下内容:
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
同时将ID
AND和分组NewRank
。您需要该MIN
玩家的全部记录。如果仅按分组,则ID
可能会得到您想要的行为,但这将需要NewRank
从SELECT
子句中删除。
我怀疑您想要最终结果集中的排名,因此请尝试以下操作:
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] 删除。
我来说两句