1

これは私のSQLビューです-それをMyViewと呼びましょう:

ECode SHCode TotalNrShare CountryCode Country
000001 +00010100UKI英国
000001 ABENSO900USA米国
000355 +000121000ESPスペイン
000355 00001050FRAフランス
000042 00999910GERドイツ
000042 +00012999ESPスペイン
000787 ABENSO500USAアメリカ合衆国
000787 000150500ITAイタリア
001010 009999100GERドイツ

各ECodeのTotalNrShare列の数値が最も大きい単一の行を返したいと思います。

たとえば、上記のビューからこれらの結果を返したいと思います。

ECode SHCode TotalNrShare CountryCode Country
000001 ABENSO900USA米国
000355 +000121000ESPスペイン
000042 +00012999ESPスペイン
000787 ABENSO500USAアメリカ合衆国
001010 009999100GERドイツ

(それぞれ500のSHCodeが2つあるECode 000787の場合、両方ではなく最初の行を返すことができるので、どちらの行が返されるかは重要ではありません。これは非常にまれであり、私の分析は100%である必要はありません)

さまざまなことを試しましたが、unqiueの結果、または必要な追加の国コード/国情報を返すことができないようです。

これは私の試みの1つです(このサイトの他のソリューションに基づいていますが、私は何か間違ったことをしています):

SELECT tsh.ECode, tsh.SHCode, tsh.TotalNrShare, tsh.CountryCode, tsh.Country
FROM  dbo.MyView AS tsh INNER JOIN
                   (SELECT DISTINCT ECode, MAX(TotalNrShare) AS MaxTotalSH
                    FROM   dbo.MyView
                    GROUP BY ECode) AS groupedtsh ON tsh.ECode = groupedtsh.ECode AND tsh.TotalNrShare = groupedtsh.MaxTotalSH
4

2 に答える 2

2
WITH
  sequenced_data AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY ECode ORDER BY TotalNrShare) AS sequence_id
  FROM
    myView
)
SELECT
  *
FROM
  sequenced_data
WHERE
  sequence_id = 1

ただし、これにより、クエリ例と同じ結果が得られるはずです。同じことを達成するためのアプローチは単純に異なります。

しかし、何かがおかしいとおっしゃっていますが、何がおかしいのか詳しく教えてください。TotalNrShareたとえば、実際には文字列ですか?そして、それはあなたの注文を台無しにしていますか(そしてそうですMAX()

編集:

上記のコードがSQLServerと互換性がない場合でも、完全にクラッシュすることはありません。エラーメッセージが表示されるはずです。Select * By Magicたとえば、を実行してみてください。エラーが発生するはずです。Management Studioのインストールを確認するか、再インストールすることを強くお勧めします。

別の方法として、これを行うことができます...

SELECT
  *
FROM
  (SELECT ECode FROM MyView GROUP BY ECode) AS base
CROSS APPLY
  (SELECT TOP 1 * FROM MyView WHERE ECode = base.ECode ORDER BY TotalNrShare DESC) AS data

理想的にはbase、サブクエリを、関心のあるすべてのECodeの個別のリストがすでに含まれているテーブルに置き換えます。

于 2012-08-14T11:25:08.203 に答える
0

これを試して;

with cte as( 
 SELECT tsh.ECode, tsh.SHCode, tsh.TotalNrShare, tsh.CountryCode, tsh.Country,
 ROW_NUMBER() over (partition by ECode order by SHCode ) as row_num 
FROM  dbo.MyView)
select * from cte where row_num=1
于 2012-08-14T11:26:22.740 に答える