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
운영게시판
최근게시물
Oracle Q&A 39034 게시물 읽기
No. 39034
최대 보유수량 구하기? 쿼리도움부탁드려여
작성자
이종성(josi1004)
작성일
2011-11-02 14:37
조회수
4,788

 

테이블 : DEAL

순번             매수/매도        거래수량

DEALNO     BUY_SELL     DEAL_QTY 

2006782             1                       3

2006783             2                       2
2006784             2                       5 
2006785             1                       1 
2006786             2                       8 
2006787             1                       1 
2006788             2                       1 
2006789             2                       1 

이렇게 데이타가 있다고 가정하고 최대보유 수량을 구하고 싶은데여~?(매수매도구분 1:매수 2:매도라고 가정)

순번기준으로 순차적으로 데이타를 읽었을때 처음 데이타 매수 최대값이 3개

2번째 데이타 기준 매대 2개 3번째 매도 5개 연속으로 매매구분이 같은 구분값일경우에는 서로 + 해서 값비교  3개랑 2+5 = 7 이랑 비교하면 7이 최대보유수량

4번째 데이타 매수1개    1 개하고 기존7개하고 비교했을때  7이 높으므로 현재 보유수량 7개

5번째 데이타 매도 8개     8개하고 기존7개하고 비교했을때 8이 높으므로 최대보유수량 8개 이런식으로 계산하면 최대보유했던 수량은 8개 라는 결과를 쿼리로 구할수있을까요? 도움부탁드려여..

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

질문자의 의도를 제대로 이해된건지 모르겠는데

현재까지 매수가 5 개고 매도가 3 개이면 현재 보유수량은 2개가 되는게 맞는거 아닌지요

매수 매도 구분자에 따라 그동안에 누적치를 서로 상쇄해 줘야 맞을꺼같은데요.....????

WITH T AS(
SELECT 2006782 COL1, 1 COL2, 3 COL3 FROM DUAL UNION ALL
SELECT 2006783 COL1, 2 COL2, 2 COL3 FROM DUAL UNION ALL
SELECT 2006784 COL1, 2 COL2, 5 COL3 FROM DUAL UNION ALL
SELECT 2006785 COL1, 1 COL2, 1 COL3 FROM DUAL UNION ALL
SELECT 2006786 COL1, 2 COL2, 8 COL3 FROM DUAL UNION ALL
SELECT 2006787 COL1, 1 COL2, 1 COL3 FROM DUAL UNION ALL
SELECT 2006788 COL1, 2 COL2, 1 COL3 FROM DUAL UNION ALL
SELECT 2006789 COL1, 2 COL2, 1 COL3 FROM DUAL
)
SELECT
        max(CURRENT_JEOGO) AS MAX_CNT
  FROM
     (
        SELECT
                COL1,
                SUM(SUM_IBGO) OVER(ORDER BY COL1) -
                SUM(SUM_CHULGO) OVER(ORDER BY COL1) AS CURRENT_JEOGO
          FROM
             (
                SELECT
                    COL1,
                    SUM(CASE WHEN COL2 = 1 THEN COL3 ELSE 0 END )  AS SUM_IBGO,
                    SUM(CASE WHEN COL2 = 2 THEN COL3 ELSE 0 END )  AS SUM_CHULGO
                FROM T
                GROUP BY COL1
             )
     )       

 
  

이동호(ssamldh)님이 2011-11-03 00:32에 작성한 댓글입니다.

쿼리 정말 감사합니다..

제의도는 상쇄개념은 아니구여

매수든 매도든 최대수량을 구하는건데 단, 연속적인 매매구분일경우는 서로 더해서 최대값을 구하는거에여

그래서 여기서 데이타를 보면 매도일경우에 2006783  2006784  번순번처럼 연속적일경우는 7개로 계산을 했을떄를 말하구여 그런데 2006786번이 8개이므로 7개보다는 높은 숫자이므로 최대보유수량이 8개가 나와야 하거든여..

이종성(josi1004)님이 2011-11-03 18:13에 작성한 댓글입니다.

WITH T AS(
SELECT 2006782 COL1, 1 COL2, 3 COL3 FROM DUAL UNION ALL
SELECT 2006783 COL1, 2 COL2, 2 COL3 FROM DUAL UNION ALL
SELECT 2006784 COL1, 2 COL2, 5 COL3 FROM DUAL UNION ALL
SELECT 2006785 COL1, 1 COL2, 1 COL3 FROM DUAL UNION ALL
SELECT 2006786 COL1, 2 COL2, 8 COL3 FROM DUAL UNION ALL
SELECT 2006787 COL1, 1 COL2, 1 COL3 FROM DUAL UNION ALL
SELECT 2006788 COL1, 2 COL2, 1 COL3 FROM DUAL UNION ALL
SELECT 2006789 COL1, 2 COL2, 7 COL3 FROM DUAL UNION ALL
SELECT 2006790 COL1, 2 COL2, 1 COL3 FROM DUAL

     
SELECT
   MAX(SUM_COL3) AS MAX_COL3
   FROM
         (
             SELECT
                      COL1,
                      COL2,
                      COL3,
                      SUM(COL3)OVER(PARTITION BY COL1 - ROWNUM ORDER BY COL1) AS SUM_COL3        
                  FROM T
                  WHERE COL2 = 1
                  UNION ALL
                  SELECT
                      COL1,
                      COL2,
                      COL3,
                      SUM(COL3)OVER(PARTITION BY COL1 - ROWNUM ORDER BY COL1) AS SUM_COL3        
                  FROM T
                  WHERE COL2 = 2   
   )

이동호(ssamldh)님이 2011-11-04 11:25에 작성한 댓글입니다.

WITH deal AS
(
SELECT 2006782 dealno, 1 buy_sell, 3 deal_qty FROM dual
UNION ALL SELECT 2006783, 2, 2 FROM dual
UNION ALL SELECT 2006784, 2, 5 FROM dual
UNION ALL SELECT 2006785, 1, 1 FROM dual
UNION ALL SELECT 2006786, 2, 8 FROM dual
UNION ALL SELECT 2006787, 1, 1 FROM dual
UNION ALL SELECT 2006788, 2, 1 FROM dual
UNION ALL SELECT 2006789, 2, 1 FROM dual
)
SELECT MAX(SUM(deal_qty)) deal_qty_max
  FROM (
        SELECT dealno, buy_sell, deal_qty
             , ROW_NUMBER() OVER(ORDER BY dealno) rn1
             , ROW_NUMBER() OVER(PARTITION BY buy_sell ORDER BY dealno) rn2
          FROM deal
        )
 GROUP BY buy_sell, rn1 - rn2
;

마농(manon94)님이 2011-11-07 10:12에 작성한 댓글입니다.

마농님 동호님 감사합니다.^^ 많은 도움되었습니다.

이종성(josi1004)님이 2011-11-08 11:22에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39037데이타가 손실되요 [1]
디비초보
2011-11-02
3557
39036GROUP BY 관련해서..2 [1]
카라
2011-11-02
4574
39035알수가 없네요 커서가 안닫히는.. [1]
지나
2011-11-02
5562
39034최대 보유수량 구하기? 쿼리도움부탁드려여 [5]
이종성
2011-11-02
4788
39033두칼럼사이의 값을 여려줄로 출력할떄.. 조언부탁드립니다. [1]
이경율
2011-11-02
4222
39032그룹함수 여러번 쓸때..
홍의명
2011-11-02
3795
39031월별 생산량 찍는 쿼리인데 ora -00936 에러가 뜨네요 ㅠㅠ [2]
박광일
2011-11-01
4551
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.015초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다