0
Row No. Start Date  End Date
1   28/11/2012           28/11/2012
2   28/11/2012            6/12/2012
3   6/12/2012             6/12/2012
4   22/01/2013           23/01/2013
5   23/01/2013  

上記のサンプル データに基づいて、次の 2 つのクエリがあります。

  1. 日付に連続性がないレコードを取得する SQL (たとえば、rrecord 3 は 2012 年 6 月 12 日に終了しますが、レコード 4 は 2013 年 1 月 22 日に開始します)。

  2. 日付に連続性がない日付の調整 (例: レコード 4 の開始日を 6/12/12 に更新して連続性を持たせる)

前もって感謝します ハリー

4

2 に答える 2

1

このlag関数を使用して、前の行の値を参照することができます (クエリの一部として「前」の意味を定義します。「行番号」は疑似列であり、注文できる実際の列ではなく、開始日順に並べたい場合):

select start_date, end_date,
  case
    when lag_end_date is null then start_date
    when lag_end_date = start_date then start_date
    else lag_end_date
  end as adj_start_date
from (
  select start_date, end_date,
    lag(end_date) over (order by start_date, end_date) as lag_end_date
  from <your_table>
)

( SQL フィドル)。

の最初のwhen節はcase、最も早い開始日を持つ「最初の」行を扱っています。前の行がないため、lagになりますnull

次に、結果をフィルタリングして、一致しないものを取得できstart_dateますadj_start_date。(別の SQL フィドル)。

a で同じ種類の構成を使用しmergeて、更新を行うことができます。

merge into <your table>
using (
  select r_id, start_date, end_date,
    case when lag_end_date is null then null
      when lag_end_date = start_date then null
      else lag_end_date
    end as adj_start_date
  from (
    select rowid as r_id, start_date, end_date,
      lag(end_date) over (order by start_date, end_date) as lag_end_date
    from t42
  )
) t
on (your_table>.rowid = t.r_id and t.adj_start_date is not null)
when matched then
update set <your table>.start_date = t.adj_start_date;

( SQL フィドル)。

于 2013-06-24T08:55:10.597 に答える
1

SELECT ステートメントは簡単です。

select * from your_table t1
where t1.end_date is not null
and not exists
   ( select null from your_table t2
     where t2.start_date = t1.end_date
     and t2.row_no != t1.row_no )

サブクエリの修飾により、レコード 3 がそれ自体を満たすことができなくなります。これは完全な解決策ではない可能性があります。開始日と終了日が同じレコードが複数ある場合、一部のレコードの識別に失敗する可能性があります。この場合、ROW_NO の信頼性が重要です。

特定のレコードのペアで、より高い ROW_NO が常に時系列的に後のレコードを示すことを保証できる場合、修正は簡単です。

     where t2.start_date = t1.end_date
     and t2.row_no > t1.row_no )

この保証が不可能な状況がいくつかあります。ROW_NO の割り当て方法によって異なります。しかし、ここにはすでに多くの推測があり、詳細を提供しない限り、それらに対処するつもりはありません。

UPDATE ステートメントはよりトリッキーです。

于 2013-06-24T08:31:40.080 に答える