Solved

SQL Server Loop and Group By

Posted on 2013-01-30
8
173 Views
Last Modified: 2013-01-31
Hello, Experts.
I want to do following for SQL Server looping.

I have several dates that needs to be broken down to intervals depending on days between.
For example, lets say I have some expired dates

01-01-13
01-15-13
01-30-13
02-02-13
03-15-13
03-22-13


I need that to be broken down into this format
Dates           Condition          Good From                 Group
01-01-13   |    Good      |            N/A            |            1
01-15-13   |    Good      |        01-01-13        |            1
01-30-13   |    Good      |        01-01-13        |            1
02-02-13   |    Good      |            N/A            |            2
02-17-13   |    Good      |        02-17-13        |            2
03-15-13   |    Good      |            N/A            |            3
03-22-13   |    Good      |        03-15-13        |            3

Can you guys help me how to do this in SQL Server 2005?

Thank you in advance!
0
Comment
Question by:kmc10314
  • 5
  • 3
8 Comments
 
LVL 92

Expert Comment

by:Patrick Matthews
ID: 38837676
Please clearly and explicitly state the rule(s) to be used in determining the grouping and the value for the 'Good From' column.
0
 
LVL 92

Accepted Solution

by:
Patrick Matthews earned 500 total points
ID: 38837993
Assuming that:
"Group" is determined by calendar month
Earliest date in a given month has no Good From value

Then this appears to do the trick:

CREATE TABLE SomeTable (Expiry datetime)

INSERT INTO SomeTable (Expiry) VALUES
('01-01-2013'),
('01-15-2013'),
('01-30-2013'),
('02-02-2013'),
('02-17-2013'),
('03-15-2013'),
('03-22-2013')

SELECT t1.Expiry AS Dates, 'Good' AS Condition, 
    CASE WHEN t1.Expiry = x.MinDate THEN NULL ELSE x.MinDate END AS [Good From],
    x.[Group]
FROM SomeTable t1 INNER JOIN
    (SELECT MIN(Expiry) AS MinDate, MAX(Expiry) AS MaxDate,
        ROW_NUMBER() OVER(ORDER BY DATEADD(month, DATEDIFF(month, 0, Expiry), 0)) AS [Group]
    FROM SomeTable
    GROUP BY DATEADD(month, DATEDIFF(month, 0, Expiry), 0)) x ON t1.Expiry >= x.MinDate AND t1.Expiry <= x.MaxDate
ORDER BY t1.Expiry

DROP TABLE SomeTable

Open in new window

0
 

Author Comment

by:kmc10314
ID: 38837994
Only critical point will be starting point.
For example, I used 30 days.

So if the initial starting point was 01-01-13, it will be grouped under 01-01-13 until 01-31-13.
Then it can restart on any date after that.
Let's say if it started on 02-02-13, the grouping will last until 03-04-13.
0
 

Author Comment

by:kmc10314
ID: 38838080
I'll try this tomorrow and see how it works out.
Quick question though.
Would it work if the dates are random?  (i.e. some months may not have dates at all)
0
Enterprise Mobility and BYOD For Dummies

Like “For Dummies” books, you can read this in whatever order you choose and learn about mobility and BYOD; and how to put a competitive mobile infrastructure in place. Developed for SMBs and large enterprises alike, you will find helpful use cases, planning, and implementation.

 
LVL 92

Expert Comment

by:Patrick Matthews
ID: 38839205
You're going to have to add more specifics--and a better example--around that thirty day rule.

As for random dates, my approach will work just fine, so long as the frame of reference is the calendar month.  So, the earliest month automatically gets Group 1, the next earliest Group 2, etc.
0
 

Author Comment

by:kmc10314
ID: 38839896
Hello,
I have tried it and it seems like it's always grouping at 1st of the month.
However, that is not the case for this example.
I did realize I made a mistake on the example above, but the concept should be same.
(Good From date for 2-17-13 should actually be 2-02-13)

Good From Date or the initial date of the group does is not always the 1st of the month.
As you see the, the groups can start on 2nd or 15th of the month.

01-01-13   |    Good      |            N/A            |            1                     -> Good From Date 1
01-15-13   |    Good      |        01-01-13        |            1
01-30-13   |    Good      |        01-01-13        |            1
02-02-13   |    Good      |            N/A            |            2                     -> Good From Date 2
02-17-13   |    Good      |        02-02-13        |            2
03-15-13   |    Good      |            N/A            |            3                     -> Good From Date 3
03-22-13   |    Good      |        03-15-13        |            3
0
 

Author Comment

by:kmc10314
ID: 38839931
NM, it did work.
Thank you for your help!
0
 

Author Comment

by:kmc10314
ID: 38840199
One more question, though
I just realized if the "Good From" Date starts from middle of the month and is stretched to next month, it does not pick up

For example,
03-15-13   |    Good      |            N/A            |            3      
03-22-13   |    Good      |        03-15-13        |            3                  -> Works
04-10-13   |    Good      |        03-15-13        |            3                  -> Does not Work.

Can you help me with this?
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

by Mark Wills PIVOT is a great facility and solves many an EAV (Entity - Attribute - Value) type transformation where we need the information held as data within a column to become columns in their own right. Now, in some cases that is relatively…
In this article we will get to know that how can we recover deleted data if it happens accidently. We really can recover deleted rows if we know the time when data is deleted by using the transaction log.
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
Internet Business Fax to Email Made Easy - With  eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, f…

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now