2017-11-20 1 views
0

"DurationTIME &"유형의 두 필드 "ActivationTime"이있는 데이터 집합이 INT 유형입니다.T의 다른 부분과 별도로 각 부분의 데이터 및 주문 항목별로 그룹화 SQL

나는 데이터에 따라이 모든 규칙을 그룹화 할 :

(1) 각 그룹의 데이터는 서로 5 일 차이의 최대 (에 "ActivationTime"값 대응이 참고해야 "처음. ActivationTime "은 데이터 세트의 최신"ActivationTime "입니다. 예를 들어, 아래 샘플에서 첫 번째"ActivationTime "은 '2017-11-24 09 : 45 : 00.000'이됩니다 (점수가 1 인 경우)

그룹화 된 데이터의 각 부분은 데이터의 다른 그룹화 된 부분에서 "점수"값 "개별적으로"정렬해야합니다.

누군가가 나를 도와 줄 수 있습니까? 르?

편집 : 예를 들어 다음과 같이 @ExampleTabel 상상 : I 제외

Score     ActivationTime 
------------------------------------------- 
    9    '2017-11-20 09:37:00.000' 
    5    '2017-11-21 09:39:00.000' 
    4    '2017-11-22 09:40:00.000' 
    3    '2017-11-23 09:43:00.000' 
    1    '2017-11-24 09:45:00.000' 
    12    '2017-11-22 09:49:00.000' 
    7    '2017-11-17 09:38:00.000' 
    2    '2017-11-15 09:41:00.000' 
    0    '2017-11-14 09:44:00.000' 
    15    '2017-11-13 09:47:00.000' 
    7    '2017-11-12 09:46:00.000' 
    20    '2017-11-11 09:42:00.000' 
    4    '2017-11-10 09:78:00.000' 

결과가 생성 될 : 귀하의 의견이를 바탕으로

Score     ActivationTime    Category 
--------------------------------------------------------------- 
    12    '2017-11-20 09:49:00.000'   1 
    9    '2017-11-20 09:37:00.000'   1 
    5    '2017-11-21 09:39:00.000'   1 
    4    '2017-11-22 09:40:00.000'   1 
    3    '2017-11-23 09:43:00.000'   1 
    1    '2017-11-24 09:45:00.000'   1 

    15    '2017-11-13 09:47:00.000'   2 
    7    '2017-11-17 09:38:00.000'   2 
    2    '2017-11-15 09:41:00.000'   2 
    0    '2017-11-14 09:44:00.000'   2 

    20    '2017-11-11 09:42:00.000'   3 
    7    '2017-11-12 09:46:00.000'   3 
    3    '2017-11-20 09:37:57.570'   3 
    4    '2017-11-10 09:78:00.000'   3 
+0

그래서 당신이 매일 상위 5 개 점수를 원하는 일부 샘플 데이터와 더 나은 도움을 얻을 것으로 예상 결과를 제공해야합니까? – Tanner

+0

아니요 다른 그룹 부분과 별도로 그룹 부분에있는 모든 데이터를 주문하고 싶습니다. 상위 N 점을 원하지 않습니다. 먼저 "ActivationTime"과 "Score"순으로 정렬하지만 쿼리 결과는 해당 시간 그룹에서 분리해야합니다. –

+1

당신은 no1 질문이 꽤 명확하지 않습니다. 원하는게 뭐야? 그룹별로 슬라이스를 작성한 다음 CTE를 사용한 다음 점수 및 활성화 시간순으로 정렬하십시오. – plaidDK

답변

1

는, 당신이 뭔가를 원하는 것 같다.

select 
Score, ActivationTime, (rnk - 1)/5 grp 
from (
    select 
     Score, ActivationTime, dense_rank()over(order by cast(ActivationTime as date) desc) rnk 
from 
    mytable 
) t 
order by grp, Score desc 

당신은 점수에 의해 주문

+0

당신의 대답은 절대적으로 옳았습니다. –

0

당신이 N 함께 할 것입니다 방법입니다 며칠 전.

처음으로 나는 며칠 째에 돌아가고 싶은 숫자가있는 더미 테이블을 만듭니다. 이 테이블은 CTE 문을 작성하기 위해 커서에서 반복됩니다. 다음 마지막으로 내가 조합 내 모든 열팽창 계수와는 activationtime에 의해 그들을 주문하고

/*SCRIPT */ 

DECLARE @NDaysAgo nvarchar(2) = 20 --Change this based on how many days you want to go back 
DECLARE @Number nvarchar(2) 
DECLARE @sqlCreateNumbers nvarchar(max) 
DECLARE @AliasName nvarchar(50) 
DECLARE @SQL nvarchar(max) 
DECLARE @SQLUnion nvarchar(max) 
DECLARE @crlf nvarchar(max) 
SET @crlf = CHAR(13) 
DECLARE @SQLTotal nvarchar(MAX) 

Set @sqlCreateNumbers = ' 

IF EXISTS (SELECT * FROM sys.objects 
WHERE object_id = OBJECT_ID(N''[dbo].[numbers]'') AND type in (N''U'')) 
DROP TABLE [dbo].[numbers]; 

SELECT TOP '[email protected]+' IDENTITY(int,0,1) AS n 
into dbo.numbers 
FROM MASTER..spt_values a, MASTER..spt_values b; 

CREATE UNIQUE CLUSTERED INDEX idx_1 ON numbers(n); 


' 
PRINT @sqlCreateNumbers 

EXEC (@sqlCreateNumbers) 


DECLARE SqlCur CURSOR FOR 
Select DaysAgo = N,Alias = 'Today'+cast(N as nvarchar(50)) 
from dbo.Numbers 
OPEN SqlCur 
FETCH NEXT FROM SqlCur 
INTO @Number,@AliasName 
IF (@@FETCH_STATUS>=0) 
BEGIN 
SET @SQL = 'with '[email protected]+' as (
Select '''[email protected]+''' as SourceName,Score,ActivationTime 
from dbo.testactivation 
Where cast(ActivationTime as date) = cast(dateadd(dd,'[email protected]+',GETDATE()) as date) 

)' 

SET @SQLUnion = 'Select * from '[email protected]+'' 

--PRINT @SQL 
FETCH NEXT FROM SqlCur INTO @Number,@AliasName 
END 
WHILE (@@FETCH_STATUS<>-1) 

BEGIN 
IF (@@FETCH_STATUS<>-2) 

SET @SQL = @SQL + ','[email protected]+' as (
Select '''[email protected]+''' as SourceName,Score,ActivationTime 
from dbo.testactivation 
Where cast(ActivationTime as date) = cast(dateadd(dd,-'[email protected]+',GETDATE()) as date) 

)' 
SET @SQLUnion = @SQLUnion + @crlf+ ' union all Select * from '[email protected]+'' 
--PRINT @SQL 

FETCH NEXT FROM SqlCur INTO @Number,@AliasName 
END 

CLOSE SqlCur 
DEALLOCATE SqlCur 


SET @SQLTotal = @SQL + 'Select * from ('[email protected]+ ') x ORDER BY ACTIVATIONTIME DESC, SCORE DESC' 

PRINT @SQLTotal --This will not show you all records since there is a limit to how much text it can show 
Select @SQLTotal -- If you select it you can see the query 

EXEC(@SQLTotal) --This will execute your statement, so you can see your descired result 

EDIT 점수 당신이 NDays을 얻을 못할 변수를 사용할 수없는 경우, 당신은 그것을 하드 코딩해야합니다. 당신이 말한 바로는 하나 개의 쿼리

Select 'Data' as SourceName,Score,ActivationTime 
from dbo.testactivation 
Where cast(ActivationTime as date) between cast(dateadd(dd,0,GETDATE()) as date) 
and cast(dateadd(dd,-20,GETDATE()) as date) 
order by ActivationTime desc,score desc 

결과 enter image description here

+0

SUM (점수)으로 아무 것도하고 싶지 않지만 "점수"필드에 대한 쿼리를 원합니다. 또한 "오늘 날짜"는 '2017-11-20 09 : 37 : 57.570'과 같이 오늘의 날짜를 의미하며 별칭이 아닙니다. –

+0

무엇? 왜 당신은 단지 당신의 데이터를 선택하고 점수와 활성화 시간으로 주문하지 않습니까? – plaidDK

+0

@MiladRashidi 편집보기 - 원하는 것입니까? – plaidDK