반응형
동일한 조건이 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
,MAX
in 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
반응형
'IT' 카테고리의 다른 글
jooq TIMESTAMP(6) 지원 (0) | 2022.11.08 |
---|---|
다른 Python 파일을 Import하려면 어떻게 해야 하나요? (0) | 2022.11.08 |
메서드 호출에서 범용 인수를 명시적으로 지정하기 위한 Java-syntax (0) | 2022.11.07 |
데이터베이스 테이블에는 프라이머리 키가 없을 수 있습니까? (0) | 2022.11.07 |
JavaScript의 키 값을 기반으로 어레이 내의 객체 검색 및 삭제 (0) | 2022.11.07 |