IT

동일한 조건이 sql의 레코드에 나타날 때까지 행 값을 가져옵니다.

itgroup 2022. 11. 7. 21:30
반응형

동일한 조건이 sql의 레코드에 나타날 때까지 행 값을 가져옵니다.

id | amount
-----------
1  | 100  |
2  | 0    |
3  | 0    |
4  | 200  |
5  | 0    |
6  | 0    |

이 표에는 값 열의 빈도가 0보다 큰 값이 포함되어 있습니다.첫 번째 값 0보다 큰 값과 두 번째 값 0보다 큰 값 사이의 값을 인쇄하는 SQL 쿼리를 찾고 있습니다.

위의 표의 출력은 다음과 같습니다.

id | amount
-----------
1  | 100  |
2  | 0    |
3  | 0    |

나는 이것을 달성하기 위해 어떤 조건이 적용될지 모르겠다.나는 그 일을 시도했다.Group By같은 값의 합계만 카운트됩니다.

각 값에 다음과 같은 고유 번호를 붙이는 것도 생각해 보았습니다.

id | Serial number | amount
---------------------------
1  |       1       | 100  |
2  |       1       | 0    |
3  |       1       | 0    |
4  |       1       | 200  |
5  |       1       | 0    |
6  |       1       | 0    |

하지만 역시 어떻게 해야 할지 몰라서 쿼리로 데이터를 표시할 수 없었습니다.

다음과 같은 경우:

WITH v AS (
 SELECT *, SUM(amount) OVER(ORDER BY id ASC) sum_amount, MAX(amount) OVER(ORDER BY id ASC) max_amount
 FROM t
)
SELECT id, amount
FROM v
WHERE sum_amount > 0 AND sum_amount = max_amount

데모

이 쿼리를 보세요.

 SELECT *, SUM(amount) OVER(ORDER BY id ASC) sum_amount, MAX(amount) OVER(ORDER BY id ASC) max_amount
 FROM t

결과 세트 포함:

+----+--------+------------+------------+
| id | amount | sum_amount | max_amount |
+----+--------+------------+------------+
|  1 |    100 |        100 |        100 |
|  2 |      0 |        100 |        100 |
|  3 |      0 |        100 |        100 |
|  4 |    200 |        300 |        200 |
|  5 |      0 |        300 |        200 |
|  6 |      0 |        300 |        200 |
|  7 |      0 |        300 |        200 |
|  8 |    300 |        600 |        300 |
|  9 |      0 |        600 |        300 |
+----+--------+------------+------------+

SUM,MAXin window 함수는 다음과 같이 현재 행까지의 값을 계산합니다.ORDER BY id ASC

  • sum_amount > 0양이 0보다 큰 첫 번째 행을 찾습니다.
  • sum_amount = max_amount값이 0보다 큰 다른 행과 그 이후의 행을 제외합니다.이러한 행에 도달하면 합계가 항상 최대값보다 커지기 때문입니다.

첫 번째 양의 값이 언제 먼저 나타나는지 알 수 없다고 생각합니다.윈도우 기능과 'case when' 로직을 사용하여 x 양의 값(x는 위치를 나타냄)과 y 양의 값(y는 x 뒤에 나타나는 위치를 나타냄) 사이의 모든 레코드를 꺼낼 수 있는 양의 값 카운터를 구축합니다.

데모

CREATE TABLE tbl (id INT PRIMARY KEY,amount INT NOT NULL);
INSERT INTO tbl VALUES
(1,0 ),(2,100),(3,0),(4,0),(5,200),(6,0),(7,0),(8,300),(9,0);
    

 SELECT 
 *, sum(amount_check) over (order by id asc)  as positive_value_counter
 FROM
    (SELECT *, 
    CASE WHEN amount > 0 then 1 else 0 end as amount_check
    FROM tbl) s   

+----+--------+---------------+------------------------+
| id | amount | amount_check  | positive_value_counter |
+----+--------+---------------+------------------------+
|  1 |      0 |        0      |        0               |
|  2 |    100 |        1      |        1               |
|  3 |      0 |        0      |        1               |
|  4 |      0 |        0      |        1               |
|  5 |    200 |        1      |        2               |
|  6 |      0 |        0      |        2               |
|  7 |      0 |        0      |        2               |
|  8 |    300 |        1      |        3               |
|  9 |      0 |        0      |        3               |
+----+--------+---------------+------------------------+
 
SELECT *
FROM
    (SELECT *, sum(amount_check) over (order by id asc)  as positive_value_counter
        FROM
        (SELECT *, 
        CASE WHEN amount > 0 then 1 else 0 end as amount_check
        FROM tbl) s
    ) m
WHERE
positive_value_counter >= 1 and positive_value_counter < 2
              
+----+--------+---------------+------------------------+
| id | amount | amount_check  | positive_value_counter |
+----+--------+---------------+------------------------+
|  2 |    100 |        1      |        1               |
|  3 |      0 |        0      |        1               |
|  4 |      0 |        0      |        1               |
+----+--------+---------------+------------------------+

언급URL : https://stackoverflow.com/questions/70213436/get-row-values-till-same-condition-appears-in-the-record-in-sql

반응형