2017-06-22 8 views
0

いくつかの行を返すselectがあります。 1つのIDに対して1行、同じIDに対して最大で2行、またはIDに対しては結果が返されません。以下の私の選択を参照してください。SQL Server:各繰り返し行の上部を選択してください(別名ではない)

ID | Type | Name | Age | email 
100  15  John  20 [email protected] 
100  10  John  20 [email protected] 
120  15  Paul  40 [email protected] 
121  15  Marie  34 [email protected] 
121  10  Marie  34 [email protected] 
150  10  Clarie 21 [email protected] 
156  15  Mark  28 [email protected] 
156  10  Mark  28 [email protected] 

が、私は取得したいと思います:

SELECT e.ID, a.Type, e.Name, e.Age, e.email 
FROM  InfoEmployee e 
      INNER JOIN AnotherTable a ON a.ID = e.ID 
WHERE  a.Type in (10,15) 
ORDER BY e.ID asc, a.Type desc 

それは例えば、以下の結果を返します

ID | Type | Name | Age | email 
100  15  John  20 [email protected] 
120  15  Paul  40 [email protected] 
121  15  Marie  34 [email protected] 
150  10  Clarie 21 [email protected] 
156  15  Mark  28 [email protected] 

IDごとに一列のみであること、一番上のもの 私は高速なクエリを探しています。

どうすればいいですか?

答えて

1

別のオプションは、TIES WITH句です。 (余分なフィールドなし)

SELECT Top 1 with Ties e.ID, a.Type, e.Name, e.Age, e.email 
FROM  InfoEmployee e 
      INNER JOIN AnotherTable a ON a.ID = e.ID 
WHERE  a.Type in (10,15) 
Order By ROW_NUMBER()OVER(Partition By e.ID Order by a.Type Desc) 
1

どうやらあなたはたったの約MAX(Type)これだけの集計を気に:

SELECT e.ID, MAX(a.Type) Type, e.Name, e.Age, e.email 
FROM  InfoEmployee e 
      INNER JOIN AnotherTable a ON a.ID = e.ID 
WHERE  a.Type in (10,15) 
GROUP BY e.ID, e.Name, e.Age, e.email 
ORDER BY e.ID asc, a.Type desc 

注:2つのまたはそれ以上の行があるたびMAX(Type)値を取得し、Name = 'Mary'用たとえば、あなただけのものを望むように見えますType = 15Name = 'John'と同じです - これは本当に必要なものですか?

+0

これは問題はありませんが、すべてのフィールドをグループ化する必要があるということです。 – user1624552

+0

これは正しい答えではありませんが、この場合はうまくいきますが、あなたが必要としていることはあまり明確ではありません。受け入れられた答えは、実際には正しい答えです。 –

1
;With cte(ID,Type,Name,Age,email) 
AS 
(
SELECT 100,15,'John' , 20, '[email protected]' UNION ALL 
SELECT 100,10,'John' , 20, '[email protected]' UNION ALL 
SELECT 120,15,'Paul' , 40, '[email protected]' UNION ALL 
SELECT 121,15,'Marie' , 34, '[email protected]' UNION ALL 
SELECT 121,10,'Marie' , 34, '[email protected]' UNION ALL 
SELECT 150,10,'Clarie' , 21, '[email protected]' UNION ALL 
SELECT 156,15,'Mark' , 28, '[email protected]' UNION ALL 
SELECT 156,10,'Mark' , 28, '[email protected]' 
) 
SELECT ID,Type,Name,Age,email from 
(
SELECT *, ROW_NUMBER()OVER(Partition By ID Order by [Type] Desc) AS Latest from cte 
)Dt 
Where Dt.Latest=1 

アウトプット

ID | Type | Name | Age | email 
100  15  John  20 [email protected] 
120  15  Paul  40 [email protected] 
121  15  Marie  34 [email protected] 
150  10  Clarie 21 [email protected] 
156  15  Mark  28 [email protected] 
関連する問題