基于列的SQL行顺序

时间:2016-08-25 02:39:43

标签: sql sql-server-2008

我正在尝试在查询中基于THREADPK1和Date列实现一个订单列。

示例结果(结尾处的所需列名为date_position:

ThreadSourceKey   CourseNumber         Date      ReadCount   Date Position
1518055            0701117023LFC    2016-08-24      18            1
1522610            0701117023LFC    2016-08-24      2             1
5443433            0701117023LFC    2016-08-25      1             1
5443433            0701117023LFC    2016-08-27      1             2
5443344            0701117023LFC    2016-08-21      1             1
5443344            0701117023LFC    2016-08-20      1             2

这是我的疑问:有兴趣知道如何合并日期位置的排序。

SELECT DISTINCT rs.threadsourcekey, 
                dc.coursenumber, 
                CONVERT (DATE, rs.modifieddate, 103) AS 'Date', 
                Sum(rs.recentreadcount)              AS ReadCount 
FROM   customfinal.rsreportingfactforumreadcounts rs 
       INNER JOIN #threads threads 
               ON rs.threadsourcekey = threads.threadsourcekey 
       INNER JOIN final.dimcourse dc 
               ON rs.coursekey = dc.coursekey 
WHERE  rs.coursekey = @CourseKey 
       AND rs.modifieddate >= Dateadd(day, -7, @DefaultDate) 
       AND rs.usersourcekey >- 1 
       AND rs.recentreadcount <> 0 
GROUP  BY rs.threadsourcekey, 
          dc.coursenumber, 
          CONVERT (DATE, rs.modifieddate, 103) 

2 个答案:

答案 0 :(得分:0)

select
ThreadSourceKey,
CourseNumber,
[Date],
ReadCount,
Date_Position = row_number() over (partition by ThreadSourceKey order by [Date])
from
(your sql statement) a

答案 1 :(得分:0)

假设您的查询工作正常,添加ROW_NUMBER()可以获得您想要的结果。

请注意,由于您的GROUP BYCONVERT (DATE, rs.modifieddate, 103),因此您需要使用它来进行分区。

SELECT DISTINCT rs.threadsourcekey, 
                dc.coursenumber, 
                CONVERT (DATE, rs.modifieddate, 103) AS 'Date', 
                Sum(rs.recentreadcount)              AS ReadCount,
               ROW_NUMBER() OVER (partition by rs.threadsourcekey order by CONVERT (DATE, rs.modifieddate, 103)) AS [DATE POSITION]

FROM   customfinal.rsreportingfactforumreadcounts rs 
       INNER JOIN #threads threads 
               ON rs.threadsourcekey = threads.threadsourcekey 
       INNER JOIN final.dimcourse dc 
               ON rs.coursekey = dc.coursekey 
WHERE  rs.coursekey = @CourseKey 
       AND rs.modifieddate >= Dateadd(day, -7, @DefaultDate) 
       AND rs.usersourcekey >- 1 
       AND rs.recentreadcount <> 0 
GROUP  BY rs.threadsourcekey, 
          dc.coursenumber, 
          CONVERT (DATE, rs.modifieddate, 103) 

如果你想选择它并看看它是如何工作的,这是一个片段。

SELECT  threadsourcekey, 
        ModDate AS 'Date', 
        Sum(ReadCount)              AS ReadCount ,
        ROW_NUMBER() OVER (partition by threadsourcekey order by ModDate) AS [DATE POSITION]
FROM   
    ( VALUES 
        (1518055,          '2016-08-24',      1),
        (1518055,          '2016-08-24',      1),
        (1518055,          '2016-08-24',      1),  
        (1522610,          '2016-08-24',      1),
        (1522610,          '2016-08-24',      1), 
        (5443433,          '2016-08-25',      1),
        (5443433,          '2016-08-27',      1),
        (5443344,          '2016-08-21',      1),
        (5443344,          '2016-08-20',      1)
    ) As Tbl (ThreadSourceKey, ModDate,     ReadCount)

GROUP  BY threadsourcekey,           
          ModDate