I'm trying extract a count of consecutive numbers, or "unbroken" years in
this case, at any particular given time.
For example (simplified):
CREATE TABLE #Customers
(
CustNo INT,
YearNo INT,
IsCust CHAR(1)
)
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2006, 'Y')
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2005, 'Y')
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2004, 'Y')
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2003, 'N')
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2002, 'N')
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2001, 'Y')
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2000, 'Y')
SELECT * FROM #Customers
CustNo YearNo IsCust
----------- ----------- ------
999 2006 Y
999 2005 Y
999 2004 Y
999 2003 N
999 2002 N
999 2001 Y
999 2000 Y
In 2006 CustNo 999 would have been active for 3 years, 2004 for 1, 2001 for
2, etc. Ideally I'd feed it a single year to lookup
I'm resisting the urge to create cursor here -- anyone have any hints?
....Chris. 10 6690
ChrisD wrote: In 2006 CustNo 999 would have been active for 3 years, 2004 for 1, 2001 for 2, etc. Ideally I'd feed it a single year to lookup
This works in Postgres, you'll have to change the "limit 1" to mssql TOP 1
syntax. Also note the hardcoded year on line 4, replace that with a
parameter.
Ironically, this only works if you specify the year. Without the year you
get spurious rows.
select a.yearno,b.year no,(a.yearno - b.yearno) + 1 as "years"
from customers a join customers b on a.custno = b.custno
where a.yearno > b.yearno
AND a.yearno = 2006
AND a.isCust = 'Y' and b.isCust = 'Y'
and not exists
(
select yearno
FROM customers x
WHERE x.custno = a.custno
AND x.yearno between b.yearno AND a.yearno
AND x.isCust = 'N'
)
order by b.yearno
limit 1
--
Kenneth Downs
Secure Data Software, Inc.
(Ken)nneth@(Sec )ure(Dat)a(.com )
"ChrisD" <sp********@hot mail.com> wrote in message news:<Yfn2e.840 846$Xk.593396@p d7tw3no>... I'm trying extract a count of consecutive numbers, or "unbroken" years in this case, at any particular given time.
For example (simplified):
CREATE TABLE #Customers ( CustNo INT, YearNo INT, IsCust CHAR(1) )
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2006, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2005, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2004, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2003, 'N') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2002, 'N') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2001, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2000, 'Y')
SELECT * FROM #Customers
8<------ Obvious result omitted In 2006 CustNo 999 would have been active for 3 years, 2004 for 1, 2001 for 2, etc. Ideally I'd feed it a single year to lookup
I'm resisting the urge to create cursor here -- anyone have any hints?
...Chris.
The computation you want to perform is a subtraction.
There are some caveats concernig your data.
Just two hints ...
how about this:
select top 1 max(a.yearno)+1 as from_ ,b.yearno as to_ , b.yearno -(
max(a.yearno)+1 ) as consecutive_tim e from #customers a join #Customers
b on a.custno = b.custno and
a.iscust='N' and b.iscust='Y' and a.yearno < b.yearno
group by b.yearno
order by consecutive_tim e desc
i.e. get the max diff between an 'N' and the 'Y' after it
create view cust as
select custno, yearno, isCust from Customers
union
select custno, min(yearno) - 1, 'N'
from Customers group by custno
go
select custno,yearno, iscust,
case iscust
when 'N' THEN 0
ELSE 1+(select count(*)
from cust a where a.custno = b.custno and
a.yearno < b.yearno and
(a.yearno >
(select max(yearno) from cust c where iscust = 'N' and yearno <
b.yearno and custno = b.custno))
) end as active_for
from cust b
where yearno >= (select min(yearno) from customers x where x.custno =
b.custno )
order by custno, yearno
"ChrisD" <sp********@hot mail.com> wrote in message news:Yfn2e.8408 46$Xk.593396@pd 7tw3no... I'm trying extract a count of consecutive numbers, or "unbroken" years in this case, at any particular given time.
For example (simplified):
CREATE TABLE #Customers ( CustNo INT, YearNo INT, IsCust CHAR(1) )
INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2006, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2005, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2004, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2003, 'N') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2002, 'N') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2001, 'Y') INSERT INTO #Customers (custno, yearno, isCust) VALUES (999, 2000, 'Y')
SELECT * FROM #Customers
CustNo YearNo IsCust ----------- ----------- ------ 999 2006 Y 999 2005 Y 999 2004 Y 999 2003 N 999 2002 N 999 2001 Y 999 2000 Y
In 2006 CustNo 999 would have been active for 3 years, 2004 for 1, 2001 for 2, etc. Ideally I'd feed it a single year to lookup
I'm resisting the urge to create cursor here -- anyone have any hints?
...Chris.
SELECT C.CustNo AS CustNo,
C.YearNo AS YearNo,
C.YearNo - MAX(FY.YearNo) + 1 AS YearTally
FROM #Customers AS C
INNER JOIN
(SELECT C1.CustNo, C1.YearNo
FROM #Customers AS C1
LEFT OUTER JOIN
#Customers AS C2
ON C1.CustNo = C2.CustNo AND
C2.YearNo = C1.YearNo - 1 AND
C2.IsCust = 'Y'
WHERE C1.IsCust = 'Y' AND C2.CustNo IS NULL) AS FY -- 1st year
ON FY.CustNo = C.CustNo AND
C.IsCust = 'Y' AND
FY.YearNo <= C.YearNo
GROUP BY C.CustNo, C.YearNo
ORDER BY CustNo, YearNo
--
JAG
"ChrisD" <sp********@hot mail.com> wrote in message news:<Yfn2e.840 846$Xk.593396@p d7tw3no>... I'm trying extract a count of consecutive numbers, or "unbroken" years in this case, at any particular given time.
For example (simplified):
CREATE TABLE #Customers ( CustNo INT, YearNo INT, IsCust CHAR(1) )
8<-----------Big snip In 2006 CustNo 999 would have been active for 3 years, 2004 for 1, 2001 for 2, etc. Ideally I'd feed it a single year to lookup
I'm resisting the urge to create cursor here -- anyone have any hints?
...Chris.
As I said in my previous posting:
The computation you want to perform is a subtraction.
There are some caveats concernig your data.
Chris wanted hints, not complete solutions.
The solutions offered are likely to fail (I didn't test this)
if there is an 'active' year without any 'inactive' predecessor.
"Theo Peterbroers" <pe*********@fl oron.leidenuniv .nl> wrote in message
news:39******** *************** ***@posting.goo gle.com... "ChrisD" <sp********@hot mail.com> wrote in message news:<Yfn2e.840 846$Xk.593396@p d7tw3no>... I'm trying extract a count of consecutive numbers, or "unbroken" years in this case, at any particular given time.
For example (simplified):
CREATE TABLE #Customers ( CustNo INT, YearNo INT, IsCust CHAR(1) ) 8<-----------Big snip In 2006 CustNo 999 would have been active for 3 years, 2004 for 1, 2001 for 2, etc. Ideally I'd feed it a single year to lookup
I'm resisting the urge to create cursor here -- anyone have any hints?
...Chris.
As I said in my previous posting: The computation you want to perform is a subtraction. There are some caveats concernig your data.
Chris wanted hints, not complete solutions.
I didn't take that as his literal intention. If it was, a quick glance
will reveal a solution, but probably not lead to comprehension,
and he can choose to ignore it.
The solutions offered are likely to fail (I didn't test this) if there is an 'active' year without any 'inactive' predecessor.
His sample data includes an active year without an inactive
predecessor. As Chris was helpful enough to include DDL
and sample data, I assume all respondents who offered
complete solutions availed themselves of it. As far as I
can tell, my solution solves the problem.
--
JAG
Yet another version, with a little-used predicate!
SELECT X.cust_nbr, MIN(X.start_dat e) AS start_date, X.end_date
FROM (SELECT C1.cust_nbr, C1.cust_year, MAX(C2.cust_yea r)
FROM Customers AS C1, Customers AS C2
WHERE C1.cust_nbr = C2.cust_nbr
AND C1.cust_year <= C2.cust_year
AND 'Y' = ALL (SELECT cust_flag
FROM Customers AS C3
WHERE C3.cust_nbr = C2.cust_nbr
AND C3.cust_year BETWEEN C1.cust_year AND
C2.cust_year)
GROUP BY C1.cust_nbr, C1.cust_year)
AS X(cust_nbr, start_year, end_year)
GROUP BY X.cust_nbr, X.end_date;
Opps! fix my typos:
SELECT X.cust_nbr, MIN(X.start_yea r) AS start_date, X.end_year
FROM (SELECT C1.cust_nbr, C1.cust_year, MAX(C2.cust_yea r)
FROM Customers AS C1, Customers AS C2
WHERE C1.cust_nbr = C2.cust_nbr
AND C1.cust_year <= C2.cust_year
AND 'Y' = ALL (SELECT cust_flag
FROM Customers AS C3
WHERE C3.cust_nbr = C2.cust_nbr
AND C3.cust_year BETWEEN C1.cust_year AND
C2.cust_year)
GROUP BY C1.cust_nbr, C1.cust_year)
AS X(cust_nbr, start_year, end_year)
GROUP BY X.cust_nbr, X.end_year; This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Adam |
last post by:
Hi,
I am trying to mark consective numbers in a data set and get a count as
to how many consecutive numbers exist in the a given line of data.
Here is an example line:
3, 5, 7, 9, 10, 13, 14
The relevant part of the script which currently checks for a
|
by: Iwilfix |
last post by:
I am completly new to Access.
I need a field to automaticly enter invoice numbers that run
consecutive.
For example records starting with an invoice # 1276, would autmaticly
go to #1277 and #1278 onthe next record.
I understand the autonumber, but would like to have a specific
starting point
thanks in advance
|
by: Dennis Ruppert |
last post by:
Greetings
This should be easy, but I am stuck!
I have a table that I import from another program. There are 25
fields, but I only need to use 3 of them for what I need to do. After
I import the data, using ODBC, the primary key is multi-field; fieldA,
fieldB, fieldC.
fieldA is a "Job Number", in text format. fieldB is a number field
|
by: Gary Wessle |
last post by:
Hi
I have a vector<charwhich looks like this (a d d d a d s g e d d d d
d k)
I need to get the biggest count of consecutive 'd'. 5 in this example
I am toying with this method but not sure if it is optimal.
thanks
int k = 0;
|
by: boliches |
last post by:
I have a seperate table to generate consecutive numbers. Using "Dmax" to find the largest number to increment .
My problem is that I want the number to begin at 1000 at the start of each month, deleteing the previous numbers created in the table.
Table : tblNewNum
Field: NewNum
Januarys Contents of field would read ie. 1000, 1001, 1002, 1003 etc
How can I get the first number generated at the start of each month to be 1000?
| |
by: xctide |
last post by:
This project will give you more experience on nested for loops and user-defined functions. The original project came from an IT company’s programming test where they were asking for the most efficient code to solve one problem. For this assignment we only focus on the correctness of our code and will not consider code efficiency.
Background
|
by: MLH |
last post by:
A mailing list table in its virgin state contained sequential,
consecutive integers in an autonumber field (A97). I've deleted
records throughout the table. Now I would like to identify each
skipped number. Hmmm??? If I'd had a boolean field named
, I could-a-check-marked it and they would-a-been much
easier to count.
How could I determine that 3 numbers were missing from the
following sequence: 1 2 4 5 7 9 and record those...
|
by: Sharkie |
last post by:
I need a regular expression which will evaluate to false if number of
consecutive characters (non-whitespace) exceeds certain number (10 in
this example).
For example, I have this function:
function test() {
var sValue="short unusuallyLongAndWayTooLongString short2";
var regEx=/\S{10,}/;
return regEx.test(sValue);
|
by: help2008 |
last post by:
Hi
I have been doing this working on an assignment for the last week and have stumbled across a part which I cant get my head around. I was hoping that someone could explain what I am missing. I do not expect you to do my work for me. I have completed the rest of the assignment and I am just stuck here (at the very end). Here is my problem.
"I have to find out the decimal values of the ratios of consecutive fibonacci numbers."
As I said...
|
by: Oralloy |
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++-12 -std=c++20 -Wnarrowing bit_field.cpp
Here is the code in...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
| |
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |