用 today until today-6 填充一列

Populate a column with today until today-6

如何在 Today -6 之前用 Today 填充列 Week?请参阅下面的 fiddle 实际结果和预期结果:

SQL Fiddle

MS SQL Server 2008 架构设置:

CREATE TABLE Registry
    ([RegistryDate] datetime)
;

INSERT INTO Registry
    ([RegistryDate])

VALUES
    ('2015-04-07'),
    ('2015-04-07'),
    ('2015-04-06'),
    ('2015-04-02'),
    ('2015-04-01'),
    ('2015-04-01'),
    ('2015-03-31'),
    ('2015-03-31'),
    ('2015-03-30'),
    ('2015-03-29')
;

查询:

SELECT DISTINCT
    TOP 7
    CASE WHEN CAST(RegistryDate AS DATE) = CAST(GETDATE() AS DATE) THEN 1 ELSE 0 END AS Indicator,
    CAST (RegistryDate AS DATE) AS LatestUpdates,
    CAST(GETDATE() AS DATE) AS Week
FROM
    Registry
ORDER BY
    1 DESC

结果:

| Indicator | LatestUpdates |       Week |
|-----------|---------------|------------|
|         1 |    2015-04-07 | 2015-04-07 |
|         0 |    2015-03-29 | 2015-04-07 |
|         0 |    2015-03-30 | 2015-04-07 |
|         0 |    2015-03-31 | 2015-04-07 |
|         0 |    2015-04-01 | 2015-04-07 |
|         0 |    2015-04-02 | 2015-04-07 |
|         0 |    2015-04-06 | 2015-04-07 |

预期结果

| Indicator | LatestUpdates |       Week |
|-----------|---------------|------------|
|         1 |    2015-04-07 | 2015-04-07 | < Today
|         0 |    2015-03-29 | 2015-04-06 | < Today -1
|         0 |    2015-03-30 | 2015-04-05 | < Today -2
|         0 |    2015-03-31 | 2015-04-04 | < Today -3
|         0 |    2015-04-01 | 2015-04-03 | < Today -4
|         0 |    2015-04-02 | 2015-04-02 | < Today -5
|         0 |    2015-04-06 | 2015-04-01 | < Today -6

我想你想要这样的查询:

WITH  SevenRowsWeek as (
SELECT LatestUpdates, CAST((GETDATE() - ROW_NUMBER() OVER (ORDER BY Latestupdates DESC) + 1) as DATE) As [Week]
FROM   (SELECT DISTINCT TOP 7 
            CAST (RegistryDate AS DATE) AS LatestUpdates
        FROM
            #Registry
        ORDER BY
            CAST(RegistryDate AS DATE) DESC ) SevenRows
)
Select  CASE WHEN CAST(LatestUpdates AS DATE) = [Week] THEN 1 ELSE 0 END AS Indicator,
        LatestUpdates, [week]
FROM SevenRowsWeek
ORDER BY LatestUpdates DESC

将您的查询包装在 subquery 中并在 cte 中使用它,然后使用 dateadd(day,-(row number-1),Week)

 with cte as
 (
 select q.Indicator ,q.LatestUpdates, q.Week,
   row_number() over(order by q.Indicator desc,q.LatestUpdates)rn 
   from (
      SELECT DISTINCT
          TOP 7
          CASE WHEN CAST(RegistryDate AS DATE) = CAST(GETDATE() AS DATE) THEN 1 ELSE 0 END AS Indicator,
          CAST (RegistryDate AS DATE) AS LatestUpdates,
          CAST(GETDATE() AS DATE) AS Week
      FROM
          Registry
      ORDER BY
          1 DESC
     )q
 )
  select Indicator,LatestUpdates,dateadd(day,-(rn-1),Week) Week
  from cte 
  order by 1 desc,2 asc

fiddle demo

试试这个:

SELECT TOP 7
        CASE WHEN CAST(RegistryDate AS DATE) = CAST(GETDATE() AS DATE) THEN 1
             ELSE 0
        END AS Indicator ,
        CAST (RegistryDate AS DATE) AS LatestUpdates ,
        DATEADD(dd,
                1 - 1
                * ROW_NUMBER() OVER ( ORDER BY CASE WHEN CAST(RegistryDate AS DATE) = CAST(GETDATE() AS DATE)
                                                    THEN 1
                                                    ELSE 0
                                               END DESC, CAST(RegistryDate AS DATE) ),
                CAST(GETDATE() AS DATE)) AS WEEK
FROM    Registry
GROUP BY CAST(RegistryDate AS DATE)
ORDER BY CASE WHEN CAST(RegistryDate AS DATE) = CAST(GETDATE() AS DATE) THEN 1
              ELSE 0
         END DESC ,
        CAST(RegistryDate AS DATE)

输出:

Indicator   LatestUpdates   Week
1           2015-04-07      2015-04-07
0           2015-03-29      2015-04-06
0           2015-03-30      2015-04-05
0           2015-03-31      2015-04-04
0           2015-04-01      2015-04-03
0           2015-04-02      2015-04-02
0           2015-04-06      2015-04-01