0

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

しかし、SQL Server CE 4 で実行することはできません (ROW_NUMBER()サポートされておらず、サポートされてOVER...PARTITIONいません)。

次のクエリを使用して、SQL Server CE で「閉じる」ことができました。

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

しかし、それでも重複するアーティスト/タイトルがリストされます - これはありません。

SQL Server CE の達人は、これについて私のためにいくつかのクエリ マジックを持っていますか?

更新: さらに説明すると、私が求めている最終結果は、次のようなデータが与えられた場合です。

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

これを返してもらいたい:

10, 'Artist1', 'Title1', 3
13, 'Artist2', 'Title1', 3
20, 'Artist2', 'Title2', 3
4

2 に答える 2

1

次のようにクエリを記述することもできます。

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
                )

(注: 「top ( 1 )」にスペースは必要ありません。それがソリューションをアップロードできる唯一の方法です。)

古いバージョンの SQL CE は をサポートしていない可能性がありますtop

于 2013-02-27T20:32:27.027 に答える
0

サブクエリを使用してみましたか:

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

デモで SQL Fiddle を参照してください

の複数のバージョンがある場合はsonguid、集計を使用できます。

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

デモで SQL Fiddle を参照してください

于 2013-02-27T20:55:48.897 に答える