database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 31410 게시물 읽기
No. 31410
초보. 쿼리문 부탁드립니다
작성자
홍길수
작성일
2023-02-05 01:06ⓒ
2023-02-06 11:34ⓜ
조회수
7,674

ㅡㅡㅡㅡtestㅡㅡㅡㅡㅡ

no.   val            name

1.      1,3,5,7,9.     jang

2.      1,2,3,4,5.    choi

3.     1,2,4,7,9.    lee

4.     2,5,7,9,1.   kim

5.    2,3,4,5,7.    park

6.     3,5,7,9,11  yoon

7.      1,2,5,8,9.  jung

8.     5,3,8,9,10 hwang

9..     3,5,2,4,6.  hong

10..   6.8,4,9,3 ki 

11..   2,6,7,3,8   moon

12..    5,4,3,2,1.  lim

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

.           ↓↓↓

ㅡㅡㅡresultㅡㅡㅡㅡㅡ

2.        1,2,3,4,5  choi

3.       1,2,4,7,9  lee

4.        2,5,7,9,1 kim   

9.        3,5,2,4,6    hong

10.      6,8,4,9,3.  ki

11.      2,6,7,3,8     moon

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

1)콤마(,)로 구분된 val항목에서

4번째 (4)와

2)그 다음줄은 3번째 (4)가 있는

다음줄을 구해야 하는데


쿼리 한번에 가능할까요

아님 for반복문 돌려야할까요?

 

이 글에 대한 댓글이 총 13건 있습니다.

예시자료가 좀 안맞는 듯 하고 : 10 번자료가 원본과 결과가 다름

질문이 좀 이해하기 어렵습니다.

4번과 11번이 나오는 이유는 뭔가요?

<= v 표시는 뭔가요?

결과 중간에 한줄 비워둔 이유는 뭔가요? 4번과 9번 사이

마농(manon94)님이 2023-02-06 11:25에 작성한 댓글입니다.
이 댓글은 2023-02-06 11:27에 마지막으로 수정되었습니다.

수정했습니다

<=표시는 이값을 가져와야된다는 뜻으로 표시함

중간공백은  의미없음


감사합니다

홍길수님이 2023-02-06 11:40에 작성한 댓글입니다. Edit
WITH test AS
(
SELECT 1 no, '1,3,5,7,9' val, 'jang' name
UNION ALL SELECT  2, '1,2,3,4,5' , 'choi'
UNION ALL SELECT  3, '1,2,4,7,9' , 'lee'
UNION ALL SELECT  4, '2,5,7,9,1' , 'kim'
UNION ALL SELECT  5, '2,3,4,5,7' , 'park'
UNION ALL SELECT  6, '3,5,7,9,11', 'yoon'
UNION ALL SELECT  7, '1,2,5,8,9' , 'jung'
UNION ALL SELECT  8, '5,3,8,9,10', 'hwang'
UNION ALL SELECT  9, '3,5,2,4,6' , 'hong'
UNION ALL SELECT 10, '6,8,4,9,3' , 'ki '
UNION ALL SELECT 11, '2,6,7,3,8' , 'moon'
UNION ALL SELECT 12, '5,4,3,2,1' , 'lim'
)
SELECT no, val, name
  FROM (SELECT no, val, name
             , v3, v4
             , LAG(v3, 1) OVER(ORDER BY no) v3_1
             , LAG(v4, 1) OVER(ORDER BY no) v4_1
             , LAG(v4, 2) OVER(ORDER BY no) v4_2
          FROM (SELECT no, val, name
                     , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 4), ',', -1) v4
                     , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 3), ',', -1) v3
                  FROM test
                ) a
        ) a
 WHERE (v4   = 4)
    OR (v4_1 = 4 AND v3   = 4)
    OR (v4_2 = 4 AND v3_1 = 4)
;

 
마농(manon94)님이 2023-02-06 13:17에 작성한 댓글입니다.

마농님 대단히 감사합니다

늦었지만 새해 복 많이 받으세요

항상 행복하세요^^

 

홍길수님이 2023-02-06 13:30에 작성한 댓글입니다. Edit

마농님 

서버버전이 5.0.96라

lag함수 에러가 나네요

lag함수는8.0부터 지원하는군요...

 

홍길수님이 2023-02-06 14:06에 작성한 댓글입니다. Edit
WITH test AS
(
SELECT 1 no, '1,3,5,7,9' val, 'jang' name
UNION ALL SELECT  2, '1,2,3,4,5' , 'choi'
UNION ALL SELECT  3, '1,2,4,7,9' , 'lee'
UNION ALL SELECT  4, '2,5,7,9,1' , 'kim'
UNION ALL SELECT  5, '2,3,4,5,7' , 'park'
UNION ALL SELECT  6, '3,5,7,9,11', 'yoon'
UNION ALL SELECT  7, '1,2,5,8,9' , 'jung'
UNION ALL SELECT  8, '5,3,8,9,10', 'hwang'
UNION ALL SELECT  9, '3,5,2,4,6' , 'hong'
UNION ALL SELECT 10, '6,8,4,9,3' , 'ki '
UNION ALL SELECT 11, '2,6,7,3,8' , 'moon'
UNION ALL SELECT 12, '5,4,3,2,1' , 'lim'
)
SELECT *
  FROM (SELECT no, val, name
             , @rn := CASE WHEN v4 = 4             THEN 1
                           WHEN v3 = 4 AND @rn = 1 THEN 2
                           WHEN            @rn = 2 THEN 3
                           ELSE 0 END rn
          FROM (SELECT no, val, name
                     , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 4), ',', -1) v4
                     , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 3), ',', -1) v3
                     , @rn := 0
                  FROM test
                 ORDER BY no LIMIT 99999
                ) a
        ) a
 WHERE rn > 0
;

 
마농(manon94)님이 2023-02-06 15:26에 작성한 댓글입니다.

마농님 정말 고맙습니다...

2라인을 아래와같이 수정적용했습니다

@rn값이 증가가 안되어 첫번째조건에 AND rn=0 추가했습니다

 @rn := CASE WHEN v4 = 4  AND rn = 0       THEN 1

홍길수님이 2023-02-06 20:52에 작성한 댓글입니다. Edit

@rn = 0 조건이 있는 것과 없는 것은 약간의 차이가 있긴 합니다.

그런데 @rn = 0 조건이 없다고 해서 결과가 안나오지는 않을 텐데요.

추가한 조건에 @ 가 없는데 @ 맞게 준건가요?

마농(manon94)님이 2023-02-07 08:47에 작성한 댓글입니다.

@rn=0을 없으면 증가없이 모두 1로 나와서

추가했습니다.

다시한번더 감사합니다

많이 배웠습니다...

 

홍길수님이 2023-02-07 10:23에 작성한 댓글입니다. Edit

모두 1로 나온다면? 아마도.

네번째가 4인 자료가 연속적으로 나오는게 아닐까? 싶은데요. 샘플과 다르게

저는 네번째에 4가 나오면 무조건 1로 다시 시작하도록 @rn = 0 조건을 일부러 뺀건데요.

해당 조건을 넣는게 원하는 결과라면 조건 추가하시면 됩니다.

저는 처음에 조건 넣을까? 하다가 일부러 뺐습니다.

네번째에 4가 나오면 무조건 1로 다시 시작하는게 맞지 않나? 생각했습니다.

마농(manon94)님이 2023-02-07 11:00에 작성한 댓글입니다.

1

1

1

1

1

2

3

1

1

1

1

1

2

3

1

1

1

1

1

이런식으로나오는데

1

2

3

1

2

3

만 나오게하려면 어떻개 해야하는지요?

아무리 머리굴려도 안되네요?

 

홍길수님이 2023-02-07 11:29에 작성한 댓글입니다. Edit
WITH test AS
(
SELECT 1 no, '1,3,5,7,9' val, 'jang' name   -- 0
UNION ALL SELECT  2, '1,2,3,4,5' , 'choi'   -- 1 -- 세트1
UNION ALL SELECT  3, '1,2,4,7,9' , 'lee'    -- 2 -- 세트1
UNION ALL SELECT  4, '2,5,7,9,1' , 'kim'    -- 3 -- 세트1
UNION ALL SELECT  5, '2,3,5,4,7' , 'park'   -- 1 -- 미완성 제외
UNION ALL SELECT  6, '3,5,7,9,11', 'yoon'   -- 0
UNION ALL SELECT  7, '1,2,5,4,9' , 'jung'   -- 1 -- 미완성 제외
UNION ALL SELECT  8, '5,3,8,9,10', 'hwang'  -- 0
UNION ALL SELECT  9, '3,5,2,4,6' , 'hong'   -- 1 -- 세트2
UNION ALL SELECT 10, '6,8,4,9,3' , 'ki '    -- 2 -- 세트2
UNION ALL SELECT 11, '2,6,7,4,8' , 'moon'   -- 3 -- 세트2
UNION ALL SELECT 12, '3,5,2,4,6' , 'hong'   -- 1 -- 세트3
UNION ALL SELECT 13, '6,8,4,9,3' , 'ki '    -- 2 -- 세트3
UNION ALL SELECT 14, '2,6,7,3,8' , 'moon'   -- 3 -- 세트3
UNION ALL SELECT 15, '3,5,2,4,6' , 'hong'   -- 1 -- 세트4
UNION ALL SELECT 16, '6,8,4,9,3' , 'ki '    -- 2 -- 세트4
UNION ALL SELECT 17, '2,6,7,3,8' , 'moon'   -- 3 -- 세트4
)
SELECT no, val, name
  FROM (SELECT no, val, name
             , rn
             , CASE WHEN rn = 3             THEN 1
                    WHEN rn = 2 AND @rn = 3 THEN 1
                    WHEN rn = 1 AND @rn = 2 THEN 1
                    ELSE 0 END flag
             , @rn := rn
          FROM (SELECT no, val, name
                     , @rn := CASE WHEN v4 = 4 AND @rn != 2 THEN 1
                                   WHEN v3 = 4 AND @rn  = 1 THEN 2
                                   WHEN            @rn  = 2 THEN 3
                                   ELSE 0 END rn
                  FROM (SELECT no, val, name
                             , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 4), ',', -1) v4
                             , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 3), ',', -1) v3
                             , @rn := 0
                          FROM test
                         ORDER BY no LIMIT 99999
                        ) a
                ) a
         WHERE rn > 0
         ORDER BY no DESC LIMIT 99999
        ) a
 WHERE flag = 1
 ORDER BY no
;

 
마농(manon94)님이 2023-02-07 13:55에 작성한 댓글입니다.
이 댓글은 2023-02-08 09:57에 마지막으로 수정되었습니다.

마농님 대단히 감사고 고맙습니다...

많이 배웠습니다^^

홍길수(jjjcjjj)님이 2023-02-08 08:40에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
31414v24n1 을 제24권 제1호 로 s224를 제 244권 으로 어떻게 바꿀까요?? [3]
김종수
2023-03-02
13942
31413서비스 운영중인 Database 클러스터에 dump 파일을 안전하게 복원하는 방법에 대한 문의
개미
2023-02-15
13258
31411mariadb procedure에서 여러 row를 한꺼번에 insert하는 방법
doritang
2023-02-14
11020
31410초보. 쿼리문 부탁드립니다 [13]
홍길수
2023-02-05
7674
31409mariadb rolling back action 관련<MS Redistribute 프로그램은 설치후에도 오류)
박재덕
2023-01-29
7085
31408MariaDB 시스템 계정 mysql, mariadb.sys 계정의 비밀번호 변경 영향 [1]
이규영
2023-01-25
7838
31407mysql 외부접속 불가ㅠ feat cafe24
룰랄라
2023-01-09
7289
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다