2013-10-25 184 views
1

每个人。我无法执行以下查询。请帮忙。 初始数据和输出中都在下面的Excel initial data/output google/drive检索数据取决于属性

这里是逻辑:为“休息” = 2500,它需要“日期”的最小值,以一增加它并把它转换成输出的日期1列;日期2收到下一个“休息”值(1181,85)的日期的最小值...等等:日期1收到'日期'(14.01.2013)的'休息'(1181,85)最小值增加1 15.01.2013)等等。它不应该为“休息”值为零的上述操作(它应该跳过它)。我们最初无法删除'Rest'值为零的行,因为它们的Date在Date2中使用,如上所述。有很多'accNumber的,它应该列出所有这些。请帮忙。我希望你明白,如果不要求更多的细节。提前致谢。我正在使用SQL服务器。

+0

1.你最好发布样本数据的小位和SO预期的直接输出(即不希望人们下载文件随机)2 。看到你所做的任何尝试都会很高兴。 –

+0

它不允许放在这里,因为我的reoutation小于10,显示数据的唯一方法是谷歌驱动器。 –

+0

select a.accNumber,a.Rest,min(a.Date),min(b.Date)from Table1 a,Table1 b where b.date> a.Date and a.accNumber = b.accNumber and a .Rest <> b.Rest Group by a.accNumber,a.Rest order by a.accNumber,3 –

回答

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] 

如果有其余地区数量正在复制进一步回落的可能,但需要是一个单独的项目,那么我们需要在我们最初选择查询有点聪明。

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 
+0

它应该只跳过0行“休息”的价值在哪里 –

+0

好的,请参阅我编辑的答案,再进一步编辑,让剩下的数字可以进一步下调,但应该被视为单独的交易。 –

+0

它给出了以下结果https://drive.google.com/file/d/0BwcVwVHkHN8Sd0VkUWdaal8wNGs/edit?usp=分享非常不同的东西。我想你理解这个逻辑。请问,请你回顾一下你的答案。我不能拿出正确的方式来做到这一点3天((感谢很多 –