중복제거 다른컬럼과 조회시 질문입니다 0 4 2,123

by zsu_k 중복제거 distinct groupby [2017.10.02 22:53:11]


현재 목록에서 historyhour 라는 컬럼은 시간을 뜻하는데, 현재 09시 데이터가 2개가 조회됩니다.

저는 그 09시 데이터 중에 1개만 조회가 되게 하고 싶습니다..(가장 최근 데이터로)

서브쿼리 하위쿼리 등등,, 제 나름대로 써봤는데 계속 09시 데이터는 똑같이 두개가 조회되더라구요..

어떻게하면 중복이 제거된 채로 나오는지 질문드립니다. 만지기 전 쿼리로 보여드립니다..

--쿼리


	SELECT
		O2
		,CO
		, LEFT(CONVERT(VARCHAR(8), CreateDate, 108),2) AS HistoryHour 
		, CONVERT(CHAR(10),CreateDate,23) AS CreateDate
	FROM [dbo].[GasHistory] AS A WITH (NOLOCK) 
	WHERE  BleDeviceKey = @BleDeviceKey

		AND ( 1 = (CASE WHEN @Type = 'L' THEN 1 ELSE  0 END) AND (CONVERT(CHAR(10),CreateDate,23) = (SELECT TOP 1
																											CONVERT(CHAR(10),CreateDate,23) AS Recentdate
																									 FROM [dbo].[GasHistory]
																									 WHERE BleDeviceKey = @BleDeviceKey
																									 ORDER BY Recentdate desc
																									)))

			OR (BleDeviceKey = @BleDeviceKey AND ( 1 = (CASE WHEN @Type = 'S' THEN 1 ELSE  0 END) AND (CONVERT(CHAR(10),CreateDate,23) = @SelectDate)))
	 ORDER BY HistoryHour ASC;

 

--조회 결과

  o2   co   historyHour   createDate

  18    1.5      01              2017-09-25

  17    3.0     07              2017-09-25

  20.9  1.0     09              2017-09-25

  15    3.5     09              2017-09-25    

by 우리집아찌 [2017.10.03 08:54:35]

둘중 가장최근값의 기준은 어떤건가요?

 


by zsu_k [2017.10.05 18:47:42]

아 늦게 확인했습니다 

최근값의 기준은 정제되지 않은 CreateDate입니다.(datetime 입니다)

가장 마지막에 insert된 데이터를 보여주면 될 것 같습니다.

혹시 중복제거 어떻게 해야될지 알려주실 수 있으신가요?ㅜㅜ 


by 우리집아찌 [2017.10.06 10:16:19]
with t (o2, co, historyHour, createDate)  as (
select 18 , 1.5 ,  01  ,  convert(DATETIME,'2017-09-25  10:11:11',120) union all
select 17 , 3.0 ,  07  ,   convert(DATETIME,'2017-09-25  10:11:12',120) union all
select 20.9 , 1.0 ,  09  ,   convert(DATETIME,'2017-09-25  10:11:13',120) union all
select 15 , 3.5 ,  09  ,  convert(DATETIME, '2017-09-25  10:11:14 ',120)
)

select a.* 
  from ( select t.* , ROW_NUMBER() OVER(PARTITION BY CONVERT(VARCHAR,createDate,112) ORDER BY createDate DESC)  rn
	   	 from t 
       ) a
 where rn = 1  

 


by 마농 [2017.10.10 14:12:25]
SELECT *
  FROM (SELECT a.o2
             , a.co
             , CONVERT(CHAR(2), a.CreateDate, 24) AS HistoryHour
             , CONVERT(CHAR   , a.CreateDate, 23) AS CreateDate
             , ROW_NUMBER() OVER(
               PARTITION BY CONVERT(CHAR(2), a.CreateDate, 24)  -- 시간대별
                   ORDER BY a.CreateDate DESC                   -- 최종시간
               ) rn
          FROM [dbo].[GasHistory] a WITH (NOLOCK)
         INNER JOIN
               (-- 조회 타입에 따라 조회일자 가져오기 --
                SELECT CAST(
                       CASE @Type WHEN 'L' THEN CONVERT(CHAR, MAX(CreateDate), 23)
                                  WHEN 'S' THEN @SelectDate
                        END
                         AS datetime) AS sdt
                  FROM [dbo].[GasHistory] WITH (NOLOCK)
                 WHERE BleDeviceKey = @BleDeviceKey
                ) b
            ON a.CreateDate >= b.sdt
           AND a.CreateDate <  DATEADD(day, 1, b.sdt)
         WHERE a.BleDeviceKey = @BleDeviceKey
        ) a
 WHERE rn = 1
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입