3

この質問に似ていますが、私のデータセットには多くの ID を持つ追加の列があります。各 ID には一定の時間枠でさかのぼるデータセットがあり、一部の週はデータが欠落している可能性があります。欠落している週の値を入力したいと思います。

たとえば、私はこれが欲しい:

ID      WEEKEND_DAY     VALUE
A00     2012-01-01      1
A00     2012-01-08      7
B00     2012-01-08      4
B00     2012-01-15      3

これに展開するには:

ID      WEEKEND_DAY     VALUE
A00     2012-01-01      1
A00     2012-01-08      7
A00     2012-01-15      0
B00     2012-01-01      0
B00     2012-01-08      4
B00     2012-01-15      3

ここで、記入したい WEEKEND_DAYs の既知の範囲 (上記の場合、2012 年 1 月 1 日から 2012 年 1 月 15 日までの毎週) が既にあります。これを行うにはどうすればよいですか?

4

2 に答える 2

2

分割された外部結合を使用します。

select data.id, weeks.weekend_day, nvl(value, 0) value
from
(
    select date '2012-01-01' weekend_day from dual union all
    select date '2012-01-08' weekend_day from dual union all
    select date '2012-01-15' weekend_day from dual
) weeks
left join
(
    select 'A00' id, date '2012-01-01' weekend_day, 1 value from dual union all
    select 'A00' id, date '2012-01-08' weekend_day, 7 value from dual union all
    select 'B00' id, date '2012-01-08' weekend_day, 4 value from dual union all
    select 'B00' id, date '2012-01-15' weekend_day, 3 value from dual
) data
    partition by (data.id)
    on weeks.weekend_day = data.weekend_day
于 2012-06-29T05:47:42.757 に答える
0

可能な週ごとにそれぞれが存在する必要があると仮定するとID、これはかなり単純です。

まず、まだ持っていない場合は「カレンダー テーブル」をお勧めします。これには、週の「最後」(または少なくとも、選択する曜日) の列が含まれている必要があります。もちろん、これは再帰的な CTE を使用して動的に生成できますが、永続的な CTE はいずれにしても有用です。

元のテーブルを考えると:

WITH id_by_date (id, weekend) as (
                 SELECT a.id, b.actualDate
                 FROM (SELECT DISTINCT id
                       FROM original) a  -- or use a table that only has ids
                 CROSS JOIN (SELECT actualDate
                             FROM calendar
                             WHERE isWeekend = '1') b) -- or dayOfWeek = 7
SELECT a.id, a.weekend, COALESCE(b.value, 0)
FROM id_by_date a
LEFT JOIN original b
ON b.id = a.id
AND b.weekend_day = a.weekend
ORDER BY a.id, a.weekend
于 2012-06-29T03:53:19.993 に答える