row_number()
함수를 사용하지 않고 SQL 서버에서 윈도우 함수를 구현하려면 어떻게해야합니까?행 번호 구현()
이상, 어떻게이 기능을 사용하지 않고 파티션을 통해
select ROW_NUMBER() OVER(PARTITION BY ATLAS_USER_ID ORDER BY Event_Time DESC) AS RR
행 번호를 구현할 수있다?
파티션은 다음과 같은 그룹입니까?
row_number()
함수를 사용하지 않고 SQL 서버에서 윈도우 함수를 구현하려면 어떻게해야합니까?행 번호 구현()
이상, 어떻게이 기능을 사용하지 않고 파티션을 통해
select ROW_NUMBER() OVER(PARTITION BY ATLAS_USER_ID ORDER BY Event_Time DESC) AS RR
행 번호를 구현할 수있다?
파티션은 다음과 같은 그룹입니까?
당신은 그냥이 정확한 당신이 찾고있는 지 확인하지 않으려 고 ..이 시도
ID int IDENTITY(1,1)
죄송합니다. mysql과 혼동합니다. ---> ID int IDENTITY (1,1) –
그러나 이것은 각 행에 id만을 제공합니다. 파티션이있는 행 번호는 각 파티션의 각 행에 id를 부여합니다. – user2783069
파티션이없는 행 번호가 'like'입니다. –
처럼 열을 추가 할 수 있습니다. 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
ok thanks! 나는 이것을 점검 할 것이고, cn은 무엇인가? – user2783069
@ user2783069 각 그룹의 수입니다. 내부 쿼리 –
을 확인하십시오! 난 이에 그럭저럭 : 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
각 행의 고유 식별자를 가정하면, 상관 하위 쿼리 또는 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;
t2와 t는 같은 테이블입니까? – user2783069
't2'와't'는 다른 테이블 별명입니다. 이 경우 동일한 테이블을 참조하게됩니다. . . 'table'이 당신의 테이블 이름을 넣을 것입니다. –
그 전체 테이블이 반환됩니다 쿼리? 이것은 원래의 쿼리는 ... 어떤 생각이야? 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
가 왜이 기능을 사용할 수 없습니다은? –
나는이 임무를 데이터베이스 구축 프로젝트 중에 얻었다. 너는 어떤 생각이있어? – user2783069
실제로 달성하고자하는 것은 무엇이며, 왜'ROW_NUMBER() '가 적절하지 않습니까? 그리고 네,'PARTITION BY'는'GROUP BY'와 효과가 비슷합니다. 그룹화를 전혀 원하지 않는다면'OVER (ORDER BY Event_Time DESC)'를 지정할 수 있습니다. –