4
SELECT * FROM dbo.Sample ORDER BY Site

出力:

Site Data
1   Cat
1   Mule
1   Pig
2   Giraffe
2   Dog
2   Horse
2   Mule
4   Cat
8   Dog
8   Pig
8   Mule
8   Bull
9   Bull
9   Giraffe
9   Moose

サイト別に並べ替えられたデータを表示したいが、以前のサイトにあった行を除外します。サイト 1 のすべてのアイテムを表示する サイト 1 にまだ表示されていないサイト 2 のすべてのアイテムなど。

したがって、結果は次のようになります。

Site    Data
----     ----
1   Cat
1   Mule
1   Pig
2   Dog
2   Giraffe
2   Horse
9   Moose

最初のリストは、いくつかの結合を含むクエリから作成されます。

実際の例は次のとおりです。

SELECT * FROM dbo.Sample WHERE Site = 1
UNION
SELECT * FROM dbo.Sample WHERE Site = 2
AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 2)
UNION
SELECT * FROM dbo.Sample WHERE Site = 8
AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 8)
UNION
SELECT * FROM dbo.Sample WHERE Site = 9
AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 9)
ORDER BY Site

サイトのリストもクエリから取得されます。

SiteList から個別のサイトを選択

1
2
4
8
9

確かにこれを行うための簡単で効率的な方法があるはずですか?

4

4 に答える 4

4

これにより、望ましい結果が得られます

SELECT MIN(Site) AS Site,
       Data
FROM   dbo.Sample
GROUP  BY Data
ORDER  BY Site 
于 2013-02-22T21:21:44.537 に答える
4

使用できますROW_NUMBER

WITH CTE AS
(
   SELECT s.*,
      RN = ROW_NUMBER () OVER (PARTITION BY Data Order By Site) 
   FROM dbo.Sample s
)
SELECT * FROM CTE WHERE RN = 1
ORDER BY Site
于 2013-02-22T21:22:41.577 に答える
2
SELECT * 
FROM dbo.sample a 
WHERE site = 
(SELECT min(site) 
 FROM dbo.sample b 
 WHERE a.data=b.data)
order by site

最初のソリューションほどエレガントではありませんが、これは、値が異なる他の列 (たとえば、色など) があり、動物ごとに 1 つの行のみが必要な場合にも機能します。

于 2013-02-22T21:35:47.877 に答える
0

これを試して

SELECT min(site)
FROM dbo.sample
GROUP BY data
ORDER BY 1
于 2013-02-22T21:22:04.463 に答える