1

每个人。我无法执行以下查询。请帮忙。初始数据和输出在以下 excel初始数据/输出 google/drive

这是逻辑:对于'Rest' = 2500,它取'Date'的最小值,将其加一并放入输出的Date1列;Date2 接收下一个“Rest”值 (1181,85) 的日期最小值.. 依此类推:Date1 接收 'Rest' (1181,85) 最小值 'Date'(14.01.2013) 加一( 15.01.2013)等等。它不应该对 'Rest' 值为零进行上述操作(它应该跳过它)。正如我在上面解释的那样,我们最初不能删除“Rest”值为零的行,因为它们的日期在 Date2 中使用。有很多'accNumber',它应该列出所有的。请帮忙。我希望你能理解,如果不询问更多细节。提前致谢。我正在使用 SQL 服务器。

4

1 回答 1

0

如果我对您的理解正确,您想按休息号对项目进行分组,然后显示最短日期 + 1 天,以及“下一个”休息号的最短日期。当两个不同地方的余数为 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 回答