1

次の一連のデータを前提として、結合された日付範囲の開始日と終了日が互いに交差する場合に、それらを選択する方法を決定しようとしています。

たとえば、PartNum 115678の場合、最終結果セットに日付範囲2012/01/01 - 2012/01/19(日付範囲が交差するため、行1、2、および4を組み合わせたもの)と2012/02/01 - 2012/03/28(これは以前に見つかった範囲と交差しないため、行3)を表示する必要があります。

PartNum 213275の場合、そのパーツの唯一の行を選択したいと思います2012/12/01 - 2013/01/01

例-データ

編集:私は現在、次のSQLステートメントで遊んでいますが、必要なものが正確に得られていません。

with DistinctRanges as (
    select distinct
        ha1.PartNum "PartNum",
        ha1.StartDt "StartDt",
        ha2.EndDt "EndDt"
    from dbo.HoldsAll ha1
    inner join dbo.HoldsAll ha2 
        on ha1.PartNum = ha2.PartNum
    where 
        ha1.StartDt <= ha2.EndDt 
        and ha2.StartDt <= ha1.EndDt
)
select 
    PartNum, 
    StartDt, 
    EndDt
from DistinctRanges

編集に表示されるクエリの結果は次のとおりです。

インラインクエリの結果

4

1 に答える 1

3

永続化されたカレンダー テーブルを使用する方がよいでしょうが、そうでない場合は、以下の CTE によってアドホックに作成されます。この部分は、ピボット ( ) から 10 年分の日付を同じ行にTOP(36000)表示するのに十分です。'20100101'

SQL フィドル

MS SQL Server 2008 スキーマのセットアップ:

create table data (
    partnum int,
    startdt datetime,
    enddt datetime,
    age int
);
insert data select 
12345, '20120101', '20120116', 15 union all select
12345, '20120115', '20120116', 1 union all select
12345, '20120201', '20120328', 56 union all select
12345, '20120113', '20120119', 6 union all select
88872, '20120201', '20130113', 43;

クエリ 1 :

with Calendar(thedate) as (
    select TOP(36600) dateadd(d,row_number() over (order by 1/0),'20100101')
      from sys.columns a
cross join sys.columns b
cross join sys.columns c
), tmp as (
   select partnum, thedate,
          grouper = datediff(d, dense_rank() over (partition by partnum order by thedate), thedate)
     from Calendar c
     join data d on d.startdt <= c.thedate and c.thedate <= d.enddt
)
select partnum, min(thedate) startdt, max(thedate) enddt
  from tmp
 group by partnum, grouper
 order by partnum, startdt

結果

| PARTNUM |                         STARTDT |                          ENDDT |
------------------------------------------------------------------------------
|   12345 |  January, 01 2012 00:00:00+0000 | January, 19 2012 00:00:00+0000 |
|   12345 | February, 01 2012 00:00:00+0000 |   March, 28 2012 00:00:00+0000 |
|   88872 | February, 01 2012 00:00:00+0000 | January, 13 2013 00:00:00+0000 |
于 2012-12-05T03:07:06.633 に答える