스프링링링
611
2021-09-30 11:38:18
4
225

쿼리문 문법 틀린 부분 좀 봐주세요 ..



SELECT id,subject,down_subject,score,DATETIME,
	ROW_NUMBER() 
		OVER(PARTITION BY 
		  subject, 
		  down_subject
		  ORDER BY DATETIME DESC) AS SEQ 
	FROM table
	WHERE id = '1' AND SEQ = 1

오라클이구요

다음과 같이 시험 점수를 등록하고 등록한 시험 점수가 datetime 최근껄로 뽑은다음 SEQ라고 정해줬어요

그럼 datetime 마다 1, 2 ~ 이런식으로 순서가 매겨지고

그 가장 최근에 올린 점수만 (seq=1)  데이터를 뽑아오도록 하고 싶은데

문법이 어디 부분이 잘못되었나요 ? ㅠㅠ

where id = '1' 만 하면 잘 나오는데 seq=1을 넣으면 안나오네요 ...

0
  • 답변 4

  • HelloDB
    76
    2021-09-30 12:00:41

    WITH 절 써서 처리하세요.

    CREATE TABLE [table]
    ( [id]      NVARCHAR(10)
    , [subject] NVARCHAR(10)
    , [down_subject] NVARCHAR(10)
    , [score] INT
    , [DATETIME] DATETIME
    )
    
    INSERT INTO dbo.[table]
    values ('1', 'subject', 'down', 100, GETDATE()), ('2', 'subject', 'down', 99, GETDATE())
    
    WITH T AS(
    SELECT [id]
          ,[subject]
          ,down_subject
          ,score
          ,[DATETIME]
          , [SEQ] = ROW_NUMBER() OVER(PARTITION BY [subject], [down_subject] ORDER BY DATETIME DESC)
    FROM dbo.[table]
    )
    SELECT * FROM T
    WHERE id = '1' AND SEQ = 1


  • HelloDB
    76
    2021-09-30 12:02:31

    위의 쿼리문은 MSSQL로 작성되었습니다.

    오라클도 WITH절은 동일합니다.

  • C#린이
    2k
    2021-09-30 12:02:39

    SELECT 쿼리 수행 순서를 아신다면

    WHERE 절의 SEQ가 정의되지 않는다는걸 알게 되실겁니다.

    하기와 같이 수정해보셔요.


    SELECT * FROM (

        SELECT id,subject,down_subject,score,DATETIME,

                       ROW_NUMBER() OVER(PARTITION BY subject, down_subject ORDER BY DATETIME DESC) AS SEQ

            FROM table

         WHERE id = '1' 

    )

    WHERE SEQ = 1;

  • 쿠잉
    4k
    2021-09-30 12:04:13

    sql 실행 순서상 where절이 select  보다 먼저 실행 되기 때문입니다

    https://mine-it-record.tistory.com/m/66

    윗분 말씀대로 인라인 뷰로 한번 감싸세요

  • 로그인을 하시면 답변을 등록할 수 있습니다.