0

以前の行を比較する必要がある SQL の非常に奇妙な問題に取り組んでいます

Number    start_date                      end_date    
 -----     -------                      ------------
 1    2011-06-07 00:00:00.000         2011-07-10 00:00:00.000   
 2    2011-10-11 00:00:00.000         2011-10-11 00:00:00.000   
 3    2011-10-26 00:00:00.000         2011-10-29 00:00:00.000   
 4    2011-10-29 00:00:00.000         2011-11-15 00:00:00.000   

ここでは、2 つの異なる行の start_date と end_date を比較し、そこからビューを作成する必要があります。( start_date が前の end_date より前の場合、基準は 1 に設定されます)。

30 日間の 2011-10-26 00:00:00.000 と 2 の 2011-10-27 00:00:00.000 を比較する必要があります。

Number    start_date                      end_date                 Criteria
-----     -----------                   ----------------          ------------
1   2011-06-07 00:00:00.000       2011-07-10 00:00:00.000            0
2   2011-10-11 00:00:00.000       2011-10-11 00:00:00.000            0
3   2011-10-26 00:00:00.000       2011-10-29 00:00:00.000            1
4   2011-10-30 00:00:00.000       2011-11-15 00:00:00.000            1   

私はこれをどのように進めるべきか混乱しています。

どんな助けでも役に立ちます!!!!

ありがとう !!!

4

3 に答える 3

2

これを行う最も簡単な方法は、サブクエリを使用することです。

select A.number, a.start_date, a.end_date,
    CASE WHEN start_date < dateadd(d,30,(select TOP(1) b.end_date
     from mytable B
     where B.number < A.number
     order by B.number desc)) then 1 else 0 end Criteria
from mytable A

注: 開始日が前の行の終了日から29 日Criteriaの場合は 1 になります。30 日目以降は 030です。必要に応じてクエリを微調整します。

サンプル:

create table mytable (
    Number int primary key,
    start_date datetime,
    end_date datetime);

insert mytable
select 1, '2011-06-07', '2011-07-10' union all
select 2, '2011-10-11', '2011-10-27' union all
select 3, '2011-10-26', '2011-10-29' union all
select 4, '2011-10-29', '2011-11-15'

結果:

number  start_date  end_date    Criteria
1   2011-06-07 00:00:00.000 2011-07-10 00:00:00.000 0
2   2011-10-11 00:00:00.000 2011-10-27 00:00:00.000 0
3   2011-10-26 00:00:00.000 2011-10-29 00:00:00.000 1
4   2011-10-29 00:00:00.000 2011-11-15 00:00:00.000 0
于 2012-09-18T20:52:48.473 に答える
1

case次のように使用してみてください。

create view vDates as
select Number,start_date,end_date, 
       case 
         when start_date<end_date 
           then 0
         else 1
       end as Criteria
from tab

SQLフィドルデモ

于 2012-09-18T20:56:47.050 に答える
0

より読みやすい方法は、関数を作成して正しい日付を送信することです。

関数:

create function [dbo].[CompareDates] (
    @START_DATE datetime,
    @PREVIOUS_END_DATE datetime
)
RETURNS int
AS
BEGIN

    if @START_DATE < @PREVIOUS_END_DATE
        return 1
    return 0

END

クエリ (サブクエリを使用):

declare @dates table
(
    number int,
    start datetime,
    end_date datetime
)

insert into @dates values
(1, '2011-06-07 00:00:00.000', '2011-07-10 00:00:00.000'),
(2, '2011-10-11 00:00:00.000', '2011-10-27 00:00:00.000'),
(3, '2011-10-26 00:00:00.000', '2011-10-29 00:00:00.000'),
(4, '2011-10-29 00:00:00.000', '2011-11-15 00:00:00.000')

select *, dbo.CompareDates(dates.end_date, dates.previous_end_date)  from
(
    select number, start, end_date,
        (select TOP 1 end_date
        from @dates d2
        where d2.number < d1.number
        order by d2.number desc) as previous_end_date
    from @dates d1
) dates
于 2012-09-19T11:18:54.043 に答える