2014-11-10 2 views
0

row_number() 함수를 사용하지 않고 SQL 서버에서 윈도우 함수를 구현하려면 어떻게해야합니까?행 번호 구현()

이상, 어떻게이 기능을 사용하지 않고 파티션을 통해

select ROW_NUMBER() OVER(PARTITION BY ATLAS_USER_ID ORDER BY Event_Time DESC) AS RR 

행 번호를 구현할 수있다?

파티션은 다음과 같은 그룹입니까?

+2

가 왜이 기능을 사용할 수 없습니다은? –

+0

나는이 임무를 데이터베이스 구축 프로젝트 중에 얻었다. 너는 어떤 생각이있어? – user2783069

+0

실제로 달성하고자하는 것은 무엇이며, 왜'ROW_NUMBER() '가 적절하지 않습니까? 그리고 네,'PARTITION BY'는'GROUP BY'와 효과가 비슷합니다. 그룹화를 전혀 원하지 않는다면'OVER (ORDER BY Event_Time DESC)'를 지정할 수 있습니다. –

답변

0

당신은 그냥이 정확한 당신이 찾고있는 지 확인하지 않으려 고 ..이 시도

ID int IDENTITY(1,1) 
+0

죄송합니다. mysql과 혼동합니다. ---> ID int IDENTITY (1,1) –

+0

그러나 이것은 각 행에 id만을 제공합니다. 파티션이있는 행 번호는 각 파티션의 각 행에 id를 부여합니다. – user2783069

+0

파티션이없는 행 번호가 'like'입니다. –

0

처럼 열을 추가 할 수 있습니다. ID 열이 필요합니다.

CREATE TABLE #TableName 
    ([Id] int,[Dates] datetime) 
; 

INSERT INTO #TableName 
    ([Id], [Dates]) 
VALUES 

    (1, '2014-08-07 00:00:00'), 
    (2, '2014-08-07 00:00:00'), 
    (3, '2014-08-07 00:00:00'), 
    (4, '2014-08-07 00:00:00'), 
    (5, '2014-08-08 00:00:00'), 
    (6,'2014-08-08 00:00:00'), 
    (7, '2014-08-08 00:00:00'), 
    (8, '2014-08-09 00:00:00'), 
    (9, '2014-08-09 00:00:00'), 
    (10, '2014-08-09 00:00:00'), 
    (11, '2014-08-10 00:00:00'), 
    (12, '2014-08-10 00:00:00'), 
    (13, '2014-08-10 00:00:00') 


SELECT CASE 
     WHEN [Id]%cn = 0 THEN cn 
     ELSE [Id]%cn 
     END, 
     * 
FROM #TableName a 
     JOIN (SELECT Count(1) cn, 
        [Dates] 
      FROM #TableName 
      GROUP BY [Dates]) b 
     ON a.[Dates] = b.[Dates] 

업데이트 :

그냥 WHERE 절에 같은 경우 문을 추가 곳에서 케이스를 추가 할 수 있습니다.

SELECT CASE 
     WHEN Id%cn = 0 THEN cn 
     ELSE Id%cn 
     END, 
     * 
FROM atlas_events a 
     JOIN (SELECT Count(1) AS cn, 
        Event_Time 
      FROM atlas_events 
      GROUP BY Event_Time) b 
     ON a.Event_Time = b.Event_Time 
WHERE PRT_PROJECT_ID = 175 
     AND ADV_PROJECT_ID = 713 
     AND event_type = 1 
     AND CASE 
      WHEN [Id]%cn = 0 THEN cn 
      ELSE [Id]%cn 
      END = 5 
+0

ok thanks! 나는 이것을 점검 할 것이고, cn은 무엇인가? – user2783069

+0

@ user2783069 각 그룹의 수입니다. 내부 쿼리 –

+0

을 확인하십시오! 난 이에 그럭저럭 : SELECT CASE WHEN 이드 %의 CN = 0 THEN ELSE 이드 % CN END CN, atlas_events FROM * JOIN (SELECT 수 (1) atlas_events FROM CN, EVENT_TIME 같은 GROUP BY 이벤트 _ 시간) b ON a.Event_Time = b. 이벤트 _ 시간 어디서 PRT_PROJECT_ID = 175 및 ADV_PROJECT_ID = 713 및 event_type = 1 – user2783069

0

각 행의 고유 식별자를 가정하면, 상관 하위 쿼리 또는 apply를 사용하여 동일한 기능을 얻을 수 있습니다. 그들이 구별하지 않은 경우

select t.*, 
     (select count(*) 
     from table t2 
     where t2.ATLAS_USER_ID = t.ATLAS_USER_ID and 
       t2.Event_Time <= t.EventTime 
     ) 
from table t; 

하지만 행에 다른 ID가 : 이벤트 시간이 서로 다른 경우

select t.*, 
     (select count(*) 
     from table t2 
     where t2.ATLAS_USER_ID = t.ATLAS_USER_ID and 
       (t2.Event_Time < t.Event_Time or 
       t2.Event_Time = t.Event_Time and t2.id <= t.id 
      ) 
     ) 
from table t; 
+0

t2와 t는 같은 테이블입니까? – user2783069

+0

't2'와't'는 다른 테이블 별명입니다. 이 경우 동일한 테이블을 참조하게됩니다. . . 'table'이 당신의 테이블 이름을 넣을 것입니다. –

+0

그 전체 테이블이 반환됩니다 쿼리? 이것은 원래의 쿼리는 ... 어떤 생각이야? RR, ATLAS_USER_ID, PRT_CAMPAIGN_TYPE, ADV_CAMPAIGN_ID, PRT_CAMPAIGN_ID ATLAS.ATLAS_EVENTS 에서 = 175 PRT_PROJECT_ID 및 ADV_PROJECT_ID = 713 EVENT_TYPE = 1) WHERE RR = 5 AS ROW_NUMBER() OVER (EVENT_TIME DESC BY ATLAS_USER_ID의 ORDER BY PARTITION)을 선택 – user2783069