[英]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.