prosource

테이블에서 행 선택, 필드 값이 나올 때까지 행 무시

probook 2023. 10. 10. 20:39
반응형

테이블에서 행 선택, 필드 값이 나올 때까지 행 무시

내부 논리에 따라 저축한 저축액과 예금 종류별로 좋은 것과 나쁜 것을 평가하는 내용을 담은 표가 있다고 치자.이 테이블에서 행을 선택하여 사용자당 이전 행부터 마지막 좋은 행까지 모두 건너뛸 수 있도록 하려면 어떻게 해야 합니까?

전에

id | 사용자 | 유형 | 금액----------------------------20 | 98 | 좋음 | 4035 | 98 | 나쁨 | 3062 | 98 | 좋음 | 2089 | 98 | 나쁨 | 6093 | 98 | 나쁨 | 10100 | 99 | 좋음 | 20103 | 99 | 좋음 | 22109 | 99 | 좋음 | 220121 | 99 | 나쁨 | 640193 | 99 | 나쁨 | 110

마지막 좋은 행이 나올 때까지 사용자의 모든 기록을 무시하고, 그 다음 행을 셀 수 있습니다.행은 연속되지 않은 ID를 증가시켜 정렬됩니다.

끝나고

id | 사용자 | 유형 | 금액----------------------------62 | 98 | 좋음 | 2089 | 98 | 나쁨 | 6093 | 98 | 나쁨 | 10100 | 99 | 좋음 | 220121 | 99 | 나쁨 | 640193 | 99 | 나쁨 | 110

테이블을 각 사용자의 최대 ID를 반환하는 쿼리에 가입합니다.type = 'good':

select t.*
from tablename t inner join (
  select user, max(id) id
  from tablename
  where type = 'good'
  group by user
) tt on tt.user = t.user and tt.id <= t.id 

데모 보기.
결과:

| id  | user | type | amount |
| --- | ---- | ---- | ------ |
| 62  | 98   | good | 20     |
| 89  | 98   | bad  | 60     |
| 93  | 98   | bad  | 10     |
| 109 | 99   | good | 220    |
| 121 | 99   | bad  | 640    |
| 193 | 99   | bad  | 110    |

하나의 방법은 상관된 하위 쿼리를 사용합니다.

select t.*
from t
where t.id >= (select max(t2.id)
               from t t2
               where t2.user = t.user and t2.type = 'good'
              );

만약 당신이 지수를 가지고 있다면 이것은 좋은 성능을 가질 것입니다.(user, type, id).

당신의 질문의 문구를 토대로 볼 때, 저는 그것이 적어도 하나의 좋은 행이 필요하다고 해석하고 있습니다.그렇지 않은 경우에는 다음과 같은 논리를 사용할 수 있습니다.

select t.*
from t
where t.id >= all (select t2.id
                   from t t2
                   where t2.user = t.user and t2.type = 'good'
                  );

창 기능을 사용할 수도 있습니다.

select t.*
from (select t.*,
             max(case when type = 'good' then id end) over (partition by user) as max_good_id
      from t
     ) t
where id >= max_good_id;

위해서MariaDB 10.2+, 다음과 같은 윈도우 분석 함수를 사용할 수 있습니다.

SUM() OVER (PARTITION BY ... ORDER BY ...)

WITH  T2 AS
(
SELECT SUM(CASE WHEN type = 'good' THEN 1 ELSE 0 END) 
           OVER (PARTITION BY user ORDER BY id DESC) AS sum,
       T.*
  FROM T     
)
SELECT id, user, type, amount
  FROM T2
 WHERE ( type = 'good' AND sum = 1 )  OR ( type != 'good' AND sum = 0 )
 ORDER BY id;

Demo

언급URL : https://stackoverflow.com/questions/59600207/select-rows-from-a-table-ignore-rows-until-a-field-value-is-encountered

반응형