首页
学习
活动
专区
圈层
工具
发布

行号Tsql
EN

Stack Overflow用户
提问于 2016-02-25 18:09:44
回答 2查看 68关注 0票数 2

我有以下语法

代码语言:javascript
复制
 select rcp.CalendarPeriodId
       ,rc.CalendarId
       ,rcp.CalendarYearId
       ,rcp.PeriodNumber
       ,rcp.PeriodStartDate,rcp.PeriodEndDate
       ,CASE WHEN GETDATE() BETWEEN rcp.PeriodStartDate AND rcp.PeriodEndDate THEN 1 ELSE 0 END AS 'CurrentPeriod'
from RentCalendarPeriod rcp
LEFT JOIN RentCalendarYear rcy ON rcy.CalenderYearId = rcp.CalendarYearId
LEFT JOIN RentCalendar rc ON rc.CalendarId = rcy.CalendarId

这就是我有两个日历(CalenderID 1=每周,CalenderID 2=每月),这是RentCalendar表。

每个Rent Calendar都有一个年份(RentCalendarYear表),而每年又有一组期间。

您会注意到,第47行,最后一列被标记为1 (true),这是因为它是当前周期。

我需要做的是为任何CalendarId标记前12个周期。我想知道我是否可以用ROW_NUMBER实现这一点,字段CurrentPeriod其中=1将是1,而之前的所有句号都将开始编号为2,3,4,5等等。

不过,我不知道该怎么做。

EN

回答 2

Stack Overflow用户

发布于 2016-02-25 18:18:57

所以就像这样:

代码语言:javascript
复制
 SELECT * FROM (
 select rcp.CalendarPeriodId,rc.CalendarId,rcp.CalendarYearId,rcp.PeriodNumber,rcp.PeriodStartDate,rcp.PeriodEndDate,
   ROW_NUMBER() OVER(ORDER BY PeriodStartDate DESC) AS CurrentPeriod
from RentCalendarPeriod rcp
LEFT JOIN RentCalendarYear rcy ON rcy.CalenderYearId = rcp.CalendarYearId
LEFT JOIN RentCalendar rc ON rc.CalendarId = rcy.CalendarId)
WHERE currentperiod <= 12

我不确定我是否理解正确。这将在CurrentPeriod列中显示最近一周的第1周、第2周、第3周,依此类推

票数 1
EN

Stack Overflow用户

发布于 2016-02-25 18:28:05

如下所示:

代码语言:javascript
复制
;WITH CTE AS (
   SELECT rcp.CalendarPeriodId, rc.CalendarId, rcp.CalendarYearId, 
          rcp.PeriodNumber, rcp.PeriodStartDate, rcp.PeriodEndDate,
          ROW_NUMBER() OVER (ORDER BY rcp.CalendarPeriodId) AS rn,
          CASE 
             WHEN GETDATE() BETWEEN rcp.PeriodStartDate AND 
                                    rcp.PeriodEndDate THEN 1 
             ELSE 0 
          END AS 'CurrentPeriod'
   FROM RentCalendarPeriod rcp
   LEFT JOIN RentCalendarYear rcy ON rcy.CalenderYearId = rcp.CalendarYearId
   LEFT JOIN RentCalendar rc ON rc.CalendarId = rcy.CalendarId
)
SELECT CalendarPeriodId, CalendarId, CalendarYearId,
       PeriodNumber, PeriodStartDate, PeriodEndDate,
       'CurrentPeriod',
       (t.rn + 1) - c.rn AS rn
FROM CTE AS c
CROSS JOIN (SELECT rn FROM CTE WHERE 'CurrentPeriod' = 1) AS t
WHERE rn BETWEEN t.rn - 11 AND t.rn

这将返回12条记录,其中包含CurrentPeriod = 1的记录和前11条记录。字段rn从具有CurrentPeriod = 1的记录开始枚举记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35624196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档