mpdillon
asked on
Help with Over Partition in a CTE
Below is a simplified CTE and the result set.
With MstrTable(IDNo, RelNo)
as (Select IDNo, RelNo From TableA where xxx
Union
Select IDNo,RelNo from TableA where yyyy)
Select IDNo,RelNo From MstrTable Order by IDNo, RelNo
Results
IDNo RelNo
1 1
2 1
3 1
3 2
4 1
Desired result Set
IDNo RelNo
1 1
2 1
3 2
4 1
I want the result set to contain only one entry for the IDNo and the MAX RelNo (see IDNo = 3 above).
With a single query in the CTE, without the UNION, Over Partition works great. But I do not think that will work as anticipated with the UNION. How do I get the result set to display a single value for IDNo and the Maximum value for RelNo?
Thanks,
pat
With MstrTable(IDNo, RelNo)
as (Select IDNo, RelNo From TableA where xxx
Union
Select IDNo,RelNo from TableA where yyyy)
Select IDNo,RelNo From MstrTable Order by IDNo, RelNo
Results
IDNo RelNo
1 1
2 1
3 1
3 2
4 1
Desired result Set
IDNo RelNo
1 1
2 1
3 2
4 1
I want the result set to contain only one entry for the IDNo and the MAX RelNo (see IDNo = 3 above).
With a single query in the CTE, without the UNION, Over Partition works great. But I do not think that will work as anticipated with the UNION. How do I get the result set to display a single value for IDNo and the Maximum value for RelNo?
Thanks,
pat
Without any understanding of what the where clauses are doing, it's hard to see why you would even need a union with both select statements querying the same table. However, given that it's necessary, would the MAX RelNO come from the first or second select statement or from either? I see no reason why an analytical query can't be used with a common table expression. Perhaps you can provide some sample data, with a little more explanation of the where clauses, and your expected results.
ASKER
Thanks.
I have attached a file which contains create table statements plus populates the tables with data.
The Raw data is:
IDNo RelNo LastModDt
1 1 '10/01/2013'
1 2 '11/01/2013'
2 1 '10/07/2013'
3 2 '11/06/2013'
4 1 '11/04/2013'
3 1 '10/21/2013'
2 2 '10/22/2013'
Desired Result
1 2 '11/01/2013'
2 2 '10/22/2013'
3 2 '11/06/2013'
4 1 '11/04/2013'
My initial CTE looks like:
with mstrTable (IDNo, RelNo, LastModDt)
as
(
Select IDNo, relNo, LastModDt from TableA
union
Select IDNo, Relno, LastModDt from TableB
)
Select IDNo, RelNo, LastModDt from mstrTable
But I cannot figure out how to get the result set down to the Desired result above.
Thanks,
pat
frmProducitonLookup-query.txt
I have attached a file which contains create table statements plus populates the tables with data.
The Raw data is:
IDNo RelNo LastModDt
1 1 '10/01/2013'
1 2 '11/01/2013'
2 1 '10/07/2013'
3 2 '11/06/2013'
4 1 '11/04/2013'
3 1 '10/21/2013'
2 2 '10/22/2013'
Desired Result
1 2 '11/01/2013'
2 2 '10/22/2013'
3 2 '11/06/2013'
4 1 '11/04/2013'
My initial CTE looks like:
with mstrTable (IDNo, RelNo, LastModDt)
as
(
Select IDNo, relNo, LastModDt from TableA
union
Select IDNo, Relno, LastModDt from TableB
)
Select IDNo, RelNo, LastModDt from mstrTable
But I cannot figure out how to get the result set down to the Desired result above.
Thanks,
pat
frmProducitonLookup-query.txt
with mstrTable (IDNo, RelNo, LastModDt)
as
(
Select IDNo, relNo, LastModDt from TableA
union
Select IDNo, Relno, LastModDt from TableB
)
Select IDNo, RelNo, LastModDt from
(Select IDNo, RelNo, LastModDt,
row_number() over (partition by IDNo order by LastModDt desc) rn
from mstrTable) as x
where x.rn = 1;
as
(
Select IDNo, relNo, LastModDt from TableA
union
Select IDNo, Relno, LastModDt from TableB
)
Select IDNo, RelNo, LastModDt from
(Select IDNo, RelNo, LastModDt,
row_number() over (partition by IDNo order by LastModDt desc) rn
from mstrTable) as x
where x.rn = 1;
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
That was it. Thank you. I replaced the LastModDt in the Partition with RelNo otherwise it worked perfectly.
thanks.
thanks.