1

みんな。次のクエリを実行できません。助けてください。初期データと出力は次のExcel初期データ/出力google/ドライブにあります

ロジックは次のとおりです。'Rest' = 2500 の場合、'Date' の最小値を取り、それを 1 増やして、出力の Date1 列に入れます。Date2 は、次の 'Rest' 値 (1181,85) の日付の最小値を受け取ります。以下同様です: Date1 は、'Rest' (1181,85) を受け取ります。 15.01.2013) など。ゼロの 'Rest' 値に対して上記の操作を行うべきではありません (単にスキップする必要があります)。上記で説明したように、Date が Date2 で使用されているため、「Rest」値がゼロの行を最初に削除することはできません。多くの 'accNumber's があります。それらすべてをリストする必要があります。助けてください。詳しくはお尋ねください。前もって感謝します。私はSQLサーバーを使用しています。

4

1 に答える 1

0

私があなたを正しく理解していれば、アイテムを休息番号でグループ化し、最小日付 + 1 日と、「次の」休息番号の最小日付を表示する必要があります。2 つの異なる場所で Rest 番号が 0 の場合、どうなると思いますか?

with Base as
(
    select    t.AccNum,
              t.Rest,
              DATEADD(day, 1, MIN(t.Date)) as [StartDate],
              ROW_NUMBER() OVER (ORDER BY MIN(t.Date)) as RowNumber
    from      Accounts t
    where     t.Rest <> 0
    group by  t.AccNum, t.Rest
)
select      a.AccNum, a.Rest, a.StartDate, DATEADD(DAY, -1, b.StartDate) as [EndDate]
from        Base a
left join   Base b
on          a.RowNumber = b.RowNumber - 1
order by a.[StartDate]

Rest 番号がさらに下に複製される可能性があるが、それを別の項目にする必要がある場合は、最初の選択クエリを少し賢くする必要があります。

with Base as
(
    select  b.AccNum, b.Rest, MIN(DATEADD(day, 1, b.Date)) as [StartDate], ROW_NUMBER() OVER (ORDER BY MIN(Date)) as [RowNumber]
    from    (
        select  *, ROW_NUMBER() OVER (PARTITION BY Rest ORDER BY Date) - ROW_NUMBER() OVER (ORDER BY Date) as [Order]
        from    Accounts a
     -- where  a.Rest <> 0 
     -- If we're still filtering out Rest 0 uncomment the above line
    ) b
    group by [order], AccNum, Rest
)
select      a.RowNumber, a.AccNum, a.Rest, a.StartDate, DATEADD(DAY, -1, b.StartDate) as [EndDate]
from        Base a
left join   Base b
on          a.RowNumber = b.RowNumber - 1
order by a.[StartDate]

両方のクエリの結果:

Account Number          REST    Start Date  End Date
45817840200000057948    2500    2013-01-01  2013-01-14
45817840200000057948    1181    2013-01-15  2013-01-31
45817840200000057948    2431    2013-02-01  2013-02-09
45817840200000057948    1563    2013-02-10  NULL
于 2013-10-25T09:36:02.050 に答える