Reputation: 242
I have this query running against my SQL Server:
SELECT SongUID, ArtistAlias, TitleAlias, Quality
FROM
(SELECT
ROW_NUMBER() OVER(PARTITION BY ArtistAlias, TitleAlias
ORDER BY Quality Desc) AS rn, *
FROM KaraokeLibrary) dt
WHERE rn = 1
But I cannot get it to run under SQL Server CE 4 (ROW_NUMBER()
not supported and OVER...PARTITION
not supported).
I've been able to get "close" in SQL Server CE with this query:
SELECT SongUID, ArtistAlias, TitleAlias, Quality
FROM KaraokeLibrary A
WHERE Quality >= 0 AND Quality IN (SELECT MAX(Quality)
FROM KaraokeLibrary B
WHERE B.ArtistAlias = A.ArtistAlias
AND B.TitleAlias = A.TitleAlias)
ORDER BY ArtistAlias, TitleAlias
But that still lists duplicate artist/titles - cannot have this.
Any SQL Server CE gurus have some query magic for me on this one?
UPDATE: To further explain – the final results I am after is when given data that looks like this:
SongUID ArtistAlias TitleAlias Quality
10, 'Artist1', 'Title1', 3
11, 'Artist1', 'Title1', 2
12, 'Artist1', 'Title1', 1
13, 'Artist2', 'Title1', 3
14, 'Artist2', 'Title1', 2
15, 'Artist2', 'Title1', 1
16, 'Artist2', 'Title2', 2
18, 'Artist2', 'Title2', 1
19, 'Artist2', 'Title2', 3
20, 'Artist2', 'Title2', 3
21, 'Artist2', 'Title2', 1
I would like to have this returned:
10, 'Artist1', 'Title1', 3
13, 'Artist2', 'Title1', 3
20, 'Artist2', 'Title2', 3
Upvotes: 0
Views: 513
Reputation: 247720
Have you tried just using a subquery:
select k1.SongUID,
k1.ArtistAlias,
k1.TitleAlias,
k1.quality
from KaraokeLibrary k1
inner join
(
select max(quality) maxQuality,
ArtistAlias, TitleAlias
from KaraokeLibrary
where Quality >= 0
group by ArtistAlias, TitleAlias
) k2
on k1.ArtistAlias = k2.ArtistAlias
and k1.TitleAlias = k2.TitleAlias
and k1.quality = k2.maxQuality
where k1.Quality >= 0
If you have multiple versions of the songuid
, then you can use an aggregate:
select max(k1.SongUID),
k1.ArtistAlias,
k1.TitleAlias,
k1.quality
from KaraokeLibrary k1
inner join
(
select max(quality) maxQuality,
ArtistAlias, TitleAlias
from KaraokeLibrary
where Quality >= 0
group by ArtistAlias, TitleAlias
) k2
on k1.ArtistAlias = k2.ArtistAlias
and k1.TitleAlias = k2.TitleAlias
and k1.quality = k2.maxQuality
where k1.Quality >= 0
group by k1.ArtistAlias,
k1.TitleAlias,
k1.quality
Upvotes: 0
Reputation: 1270001
You can also write the query like this:
SELECT SongUID, ArtistAlias, TitleAlias, Quality
From KaraokeLibrary kl
where quality > 0 and
songuid = (select top ( 1 ) songuid
from Karokelibrary kl2
WHERE kl.ArtistAlias=kl2.ArtistAlias AND kl.TitleAlias=kl2.TitleAlias
order by quality desc
)
(Note: you don't need the spaces in "top ( 1 )". It is the only way I could upload the solution.)
Older versions of SQL CE may not support top
.
Upvotes: 1