簡體   English   中英

SQL SERVER:每7行自動增加7

[英]SQL SERVER: auto-increment by 7 every 7 rows

我正在嘗試規范WeekOfYear列,而我當前的表格格式如下所示:

Week  DOW
  1  FRIDAY
     SATURDAY
     SUNDAY
     MONDAY
     TUESDAY
     ...
  2  FRIDAY
     SATURDAY
     SUNDAY
     MONDAY
     TUESDAY
     ...

從本質上講,我該如何填充“周”列中的缺失值,如下所示:

Week  DOW
  1  FRIDAY
  1  SATURDAY
  1  SUNDAY
  1   MONDAY
  1  TUESDAY
  1  ...
  2  FRIDAY
  2  SATURDAY
  2  SUNDAY
  2  MONDAY
  2  TUESDAY
  2  ...

這是一個SQL查詢,可為我的問題的示例數據創建一個簡單的版本:

CREATE TABLE dbo.foobar
(
 Wk CHAR(2),
 DOW CHAR(10)
 );


 INSERT INTO dbo.foobar(Wk, DOW)
 VALUES 
 (1, 'FRIDAY'),
 (NULL,'SATURDAY'),
 (NULL,'SUNDAY'),
 (2, 'FRIDAY'),
 (NULL,'SATURDAY'),
 (NULL,'SUNDAY')


 SELECT * FROM dbo.foobar

我最初的想法是使用某種內置的自動增量功能,但是如果該功能不存在,那么我會寫一些CASE語句來說明當前行是否為空白,然后使用上一行的數字。

任何想法將不勝感激。

提前致謝!

SQL表本質上是無序的。 因此,使用您提供的樣本數據,您將無法做自己想做的事情。

如果添加主鍵來指定順序,則可以執行所需的操作。 看起來像:

CREATE TABLE dbo.foobar (
    pk int not null identity(1, 1) primary key,
    Wk CHAR(2),
    DOW CHAR(10)
 );


INSERT INTO dbo.foobar(Wk, DOW)
  VALUES (1, 'FRIDAY'),
         (NULL,'SATURDAY'),
         (NULL,'SUNDAY'),
         (2, 'FRIDAY'),
         (NULL,'SATURDAY'),
         (NULL,'SUNDAY');

 SELECT * FROM dbo.foobar;

其余部分假設主鍵已適當排序,但不一定無間隙。

然后,您可以使用簡單的算法執行所需的操作:

select 1 + (row_number() over (order by pk) - 1) / 7 as newwk, f.*
from foobar;

另外,如果您想保留當前值,則可以使用該算法定義組,然后在組中“傳播”該值:

select max(wk) over (partition by grp) as newwk, f.*
from (select 1 + (row_number() over (order by pk) - 1) / 7 as grp, f.*
      from foobar f
     ) f;

編輯:

以上假設每個組有7個項目。 如果不是這樣,則可以只計算wk的有效值:

select max(wk) over (partition by grp) as newwk, f.*
from (select (count(wk) over (order by pk)) as grp, f.*
      from foobar f
     ) f;

是一個SQL Fiddle。

我假設您的表中有一些身份pk以保證排序:

select wk as oldwk, 
       dow, 
       (select top 1 wk 
        from foobar f2 
        where f2.id <= f1.id and f2.wk is not null
        order by f2.id desc) as newwk
from foobar f1

更新:

update f1
set wk = (select top 1 wk 
          from foobar f2 
          where f2.id <= f1.id and f2.wk is not null
          order by f2.id desc)
from foobar f1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM