programing

사용자별로 조건을 충족하는 초기 항목 필터링

powerit 2023. 6. 7. 23:19
반응형

사용자별로 조건을 충족하는 초기 항목 필터링

SQL을 처음 사용하는 사용자이므로 제가 읽은 예와 완전히 일치하지 않는 방식으로 데이터베이스를 필터링하고 싶습니다.MariaDB와 함께 SQL을 사용하고 있습니다.

표는 다음과 같은 구조를 가진 게임 결과 보고서입니다.

  • id(각 보고서에 대한 정수 ID 포함, 기본 키)
  • user_id(각 플레이어에 할당된 라이센스 ID)
  • day (결과적으로, 보고되는 일일 퍼즐의 정체)
  • 결과(평균 점수)
  • 제출됨(보고서 제출 제외)

당일 퍼즐은 현지 시간으로 자정에 종료되므로 두 개의 보고서를 동시에 제출할 수 있지만 다른 날의 보고서를 작성할 수 있습니다.

저는 매일 보고되는 평균 점수를 찾을 수 있기를 원하지만, 그 전에 특정 점수를 받은 적이 없는 사용자의 점수를 제외하고 싶습니다(완전히 초보자와 게임을 잘 못하는 사람을 제거하기 위해).하지만 저는 이 배제에서 어떻게 계층화할지 알아낼 수 없습니다.

다음과 같은 질문을 통해 각 사용자가 가장 먼저 성공한 게임을 얻을 수 있습니다.

SELECT id, user_id, MIN(submitted), result FROM ‘results_daily’ WHERE result > 5 GROUP BY user_id

(그것을 출력1이라고 부르자)

그러나 이를 필터로 일별 결과 집합에 적용하는 방법을 알 수 없습니다(따라서 평균 계산에는 출력1에 사용자 기능이 포함되고 출력1에는 해당 사용자의 날짜 이후에 해당 사용자의 일별 보고서가 제출된 결과만 포함됩니다).

JOIN 수술 같은 느낌이 드는데 머리를 감을 수가 없어요.누가 도와줄 수 있습니까?

추가할 편집 대상:

알겠습니다. 제 솔루션은 기능을 사용하고 있고, 이 기능이 SQL-y 방식 중에서 가장 효율적인지 확실하지 않습니다.본능적으로 이것은 기능 없이도 가능해야 한다고 느끼지만, 저는 그것이 가능하다면 그것을 해결할 만큼 충분히 연습되지 않았습니다!O. 존스의 대답은 제외된 집합을 함수로 세분화하는 데 필요한 올바른 길을 열어주었습니다.이제 제 질문은 다음과 같습니다.

SELECT day, 
       AVG(result) average_score,
       COUNT(*) number_of_plays,
       COUNT(DISTINCT user_id) number_of_non_n00b_players
  FROM results_daily
 WHERE user_id NOT IN (
             SELECT user_id 
               FROM results_daily
                WHERE submitted < GetEureka(user_id)
              GROUP BY user_id )           
 GROUP BY day; 

그리고 내 함수 GetEureka()는 다음과 같습니다.

DECLARE eureka TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

SELECT
    MIN(submitted) INTO eureka
FROM
    results_daily
WHERE
    user_id = user
    AND
    result >= 5
GROUP BY
    user_id;
RETURN eureka;

SQL에서는 집합에 대해 생각합니다.당신은 한 세트가 필요합니다.user_id다음 두 가지 기준 중 하나를 충족하는 모든 n00bz의 값:

  • 5보다 큰 점수는 없습니다.
  • 게임의 플레이는 단 한 번뿐입니다.

그런 다음 평균을 계산할 때 해당 사용자 ID가 있는 행을 제외합니다.

, n00bz의 으로 n00bz를 마법의 힘으로.GROUP BY그리고.HAVING조항

       SELECT user_id 
         FROM results_daily
        GROUP BY user_id 
       HAVING COUNT(*) = 1 OR MAX(result) <= 5

이제 통계를 실행할 수 있습니다.

SELECT day, 
       AVG(score) average_score,
       COUNT(*) number_of_plays,
       COUNT(DISTINCT user_id) number_of_non_n00b_players
  FROM results_daily
 WHERE user_id NOT IN (
             SELECT user_id 
               FROM results_daily
              GROUP BY user_id 
             HAVING COUNT(*) = 1 OR MAX(result) <= 5 )           
 GROUP BY day; 

구조화된 질의 언어는 중첩된 하위 질의를 사용하여 행 집합을 정의하고 해당 하위 질의와 함께 작업하기 때문입니다.

언급URL : https://stackoverflow.com/questions/74891760/filtering-out-early-entries-meeting-a-condition-on-a-per-user-basis

반응형