June 16, 2015 at 1:46 pm
This should work:
NOTICE - I purposely created a gap for CBA to demonstrate.
DECLARE @test-2 TABLE ([Index] INT, FactorS NVARCHAR(3), Value DECIMAL(2,1), [Date] DATE)
INSERT INTO @test-2 ([Index], FactorS, Value, [Date])
VALUES (1, 'XYZ', 2.3, '12/31/2014'),
(2, 'XYZ', 1.4, '12/30/2014'),
(3, 'XYZ', 3.3, '12/29/2014'),
(4, 'ABC', 1.8, '12/31/2014'),
(5, 'ABC', 2.2, '12/30/2014'),
(6, 'CBA', 1.7, '12/31/2014'),
(7, 'CBA', 1.8, '12/30/2014'),
(8, 'CBA', 1.9, '12/29/2014'),
(9, 'CBA', 2.1, '12/27/2014');
WITH working (FactorS, MaxDate)
AS
(
SELECT FactorS, MAX([Date]) FROM @test-2 GROUP BY FactorS
)
SELECT
t.[Index],
t.FactorS,
t.Value,
t.[Date],
DATEDIFF(dd,t.Date, w.MaxDate) + 1 AS Lag
FROM
@test-2 t
JOIN working w ON w.FactorS = t.FactorS
ORDER BY
t.[Index]
June 16, 2015 at 1:48 pm
awesome..thank you for the great help!!
June 16, 2015 at 2:47 pm
Hey all, thanks for the feedback, i'm not quite there yet... Trying to simplify how I'm stating my need:
This is what my table looks like:
Customers
Name, Date
‘John’, ‘2015-01-01’
‘John’, ‘2015-01-02’
‘John’, ‘2015-01-05’
‘John’, ‘2015-01-06’
‘John’, ‘2015-01-07’
‘Mike’, ‘2015-01-01’
‘Mike’, ‘2015-01-02’
‘Mike’, ‘2015-01-03’
You’ll notice that there is no data for January 3 or 4 since they were weekends.
What I would like is to add a column that counts “non-holiday weekdays” for each person, so the data will look like this:
Customers
Name, Date, Weekdays
‘John’, ‘2015-01-01’, 1
‘John’, ‘2015-01-02’, 2
‘John’, ‘2015-01-05’, 3
‘John’, ‘2015-01-06’, 4
‘John’, ‘2015-01-07’, 5
‘Mike’, ‘2015-01-01’, 1
‘Mike’, ‘2015-01-02’, 2
‘Mike’, ‘2015-01-05’, 3
I can get partial results with the following query:
SELECT *, ROW_NUMBER() OVER (ORDER BY Date) as Weekdays INTO Customers_1 FROM Customers WHERE Name='John'
However, this must be done one-by-one for each customer, and creates a duplicate of the table in order to accomplish it.
What I need is something roughly like:
UPDATE Customers SET Weekdays=__row-number-on-a-per-customer-basis-when-date-sorted__
June 16, 2015 at 2:54 pm
Is January 1st a holiday for you?
--Jeff Moden
Change is inevitable... Change for the better is not.
June 16, 2015 at 3:00 pm
p.s. The ROW_NUMBER method I mentioned previously will still work for this.
--Jeff Moden
Change is inevitable... Change for the better is not.
June 16, 2015 at 4:25 pm
pederson1234 (6/16/2015)
Hey all, thanks for the feedback, i'm not quite there yet... Trying to simplify how I'm stating my need:This is what my table looks like:
Customers
Name, Date
‘John’, ‘2015-01-01’
‘John’, ‘2015-01-02’
‘John’, ‘2015-01-05’
‘John’, ‘2015-01-06’
‘John’, ‘2015-01-07’
‘Mike’, ‘2015-01-01’
‘Mike’, ‘2015-01-02’
‘Mike’, ‘2015-01-03’
You’ll notice that there is no data for January 3 or 4 since they were weekends.
What I would like is to add a column that counts “non-holiday weekdays” for each person, so the data will look like this:
Customers
Name, Date, Weekdays
‘John’, ‘2015-01-01’, 1
‘John’, ‘2015-01-02’, 2
‘John’, ‘2015-01-05’, 3
‘John’, ‘2015-01-06’, 4
‘John’, ‘2015-01-07’, 5
‘Mike’, ‘2015-01-01’, 1
‘Mike’, ‘2015-01-02’, 2
‘Mike’, ‘2015-01-05’, 3
I can get partial results with the following query:
SELECT *, ROW_NUMBER() OVER (ORDER BY Date) as Weekdays INTO Customers_1 FROM Customers WHERE Name='John'
However, this must be done one-by-one for each customer, and creates a duplicate of the table in order to accomplish it.
What I need is something roughly like:
UPDATE Customers SET Weekdays=__row-number-on-a-per-customer-basis-when-date-sorted__
A calendar or "dimDate" table will make this a much simpler task.
Don Simpson
June 16, 2015 at 4:31 pm
DonlSimpson (6/16/2015)
pederson1234 (6/16/2015)
Hey all, thanks for the feedback, i'm not quite there yet... Trying to simplify how I'm stating my need:This is what my table looks like:
Customers
Name, Date
‘John’, ‘2015-01-01’
‘John’, ‘2015-01-02’
‘John’, ‘2015-01-05’
‘John’, ‘2015-01-06’
‘John’, ‘2015-01-07’
‘Mike’, ‘2015-01-01’
‘Mike’, ‘2015-01-02’
‘Mike’, ‘2015-01-03’
You’ll notice that there is no data for January 3 or 4 since they were weekends.
What I would like is to add a column that counts “non-holiday weekdays” for each person, so the data will look like this:
Customers
Name, Date, Weekdays
‘John’, ‘2015-01-01’, 1
‘John’, ‘2015-01-02’, 2
‘John’, ‘2015-01-05’, 3
‘John’, ‘2015-01-06’, 4
‘John’, ‘2015-01-07’, 5
‘Mike’, ‘2015-01-01’, 1
‘Mike’, ‘2015-01-02’, 2
‘Mike’, ‘2015-01-05’, 3
I can get partial results with the following query:
SELECT *, ROW_NUMBER() OVER (ORDER BY Date) as Weekdays INTO Customers_1 FROM Customers WHERE Name='John'
However, this must be done one-by-one for each customer, and creates a duplicate of the table in order to accomplish it.
What I need is something roughly like:
UPDATE Customers SET Weekdays=__row-number-on-a-per-customer-basis-when-date-sorted__
A calendar or "dimDate" table will make this a much simpler task.
How? He already supposedly has the dates he wants and just wants to number the output. How would a Calendar table make that any easier than a single SELECT with a ROW_NUMBER column in it?
--Jeff Moden
Change is inevitable... Change for the better is not.
June 17, 2015 at 11:15 am
Jeff Moden (6/16/2015)
DonlSimpson (6/16/2015)
A calendar or "dimDate" table will make this a much simpler task.How? He already supposedly has the dates he wants and just wants to number the output. How would a Calendar table make that any easier than a single SELECT with a ROW_NUMBER column in it?
I guess I assumed that dates would continue in the future, and I was focusing on this:
UPDATE Customers SET Weekdays=__row-number-on-a-per-customer-basis-when-date-sorted__
I use a calendar table that includes things like "calendarYearWorkdayNumber" and "fiscalYearWorkdayNumber."
Don Simpson
June 17, 2015 at 3:12 pm
DonlSimpson (6/17/2015)
Jeff Moden (6/16/2015)
DonlSimpson (6/16/2015)
A calendar or "dimDate" table will make this a much simpler task.How? He already supposedly has the dates he wants and just wants to number the output. How would a Calendar table make that any easier than a single SELECT with a ROW_NUMBER column in it?
I guess I assumed that dates would continue in the future, and I was focusing on this:
UPDATE Customers SET Weekdays=__row-number-on-a-per-customer-basis-when-date-sorted__
I use a calendar table that includes things like "calendarYearWorkdayNumber" and "fiscalYearWorkdayNumber."
Ah... got it. Thanks for the feedback.
--Jeff Moden
Change is inevitable... Change for the better is not.
June 18, 2015 at 3:11 pm
For the original poster, the ROW_NUMBER() function you're looking for would look like this:
ROW_NUMBER() OVER(PARTITION BY [Name] ORDER BY [Date]) AS Weekdays
The PARTITION BY portion will start the numbering over with each different Name value, and is considerd a "Window" function, because it doesn't require a GROUP BY, but can still see values from other records than the current one.
Steve (aka sgmunson)
Rent Servers for Income (picks and shovels strategy)
Viewing 10 posts - 16 through 24 (of 24 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy