3

週末や休日の問題に対処するために使用しようとしているカレンダーテーブルがあります。

構造は単純です。

CREATE TABLE calendar
(
    daterank INT,
    thedate DATE
);

アイデアは、すべてのレコードに日付ランクがあり、比較の目的で使用されるというものです。休日以外の平日は増分の daterank を持ち、週末と祝日は直前の休日以外の平日と同じ daterank を持ちます。

休日以外の平日のdaterankの設定は思ったより簡単でしたが、土日祝日の設定は思ったより複雑です。

データのサブセット:

daterank    thedate

881         2013-05-21
882         2013-05-22
883         2013-05-23
884         2013-05-24
NULL        2013-05-25
NULL        2013-05-26
885         2013-05-27
886         2013-05-28
887         2013-05-29
888         2013-05-30
889         2013-05-31
NULL        2013-06-01

上記の場合、5/25 と 5/26 の NULL を 884 (5/24 の値) に、6/1 の NULL を 889 などに置き換えたいと思います。

機能しないもの:

UPDATE calendar c1
SET c1.daterank = (
    SELECT MAX(c2.daterank)
    FROM calendar c2
    WHERE c2.thedate < c1.thedate
    AND c2.daterank IS NOT NULL
)
WHERE daterank IS NULL
;

何か案は?

4

4 に答える 4

1

以下を使用して結果を取得できます。

;with cte as
(
  select daterank, thedate
  from calendar
  where daterank is null
) 
update c
set c.daterank = d.daterank
from cte c
cross apply
(
  select top 1 daterank, thedate
  from calendar d
  where d.thedate < c.thedate
    and d.daterank is not null
  order by daterank desc
) d;

デモで SQL Fiddle を参照してください

于 2013-05-28T21:27:39.187 に答える
0

これが私の試みです;)

;WITH cte AS
(
  SELECT t.r, t.d
    FROM t 
   WHERE t.r IS NOT NULL
)
, tbl AS
(
  SELECT
    (
      SELECT cte.r
        FROM cte
       WHERE cte.d = (SELECT MAX(sub.d)
                        FROM cte sub
                       WHERE sub.d <= t.d)
    ) AS r,
    t.d
  FROM t 
)

UPDATE t
   SET t.r = tbl.r
  FROM t
  JOIN tbl ON tbl.d = t.d
 WHERE t.r IS NULL

SELECT * FROM t

デモ

于 2013-05-28T21:36:16.267 に答える