2

各人の最大 (またはトップ) トランザクションを返すクエリを実行しようとしている 2 つのテーブルがあります。テーブル構造を変更できないことに注意してください。むしろ、データをプルすることしかできません。

人々

+---------+
| | ID | 名前 |
+---------+
| | 42 | ボブ |
| | 65 | テッド |
| | 99 | ストゥ|
+---------+

トランザクション (主キーはありません)

+---------------------------------+
| | 人 | 金額 | 日付 |
+---------------------------------+
| | 42 | 3 | 2030 年 9 月 14 日 |
| | 42 | 4 | 2015 年 7 月 2 日 |
| | 42 | *ヌル* | 2020 年 2 月 4 日 |
| | 65 | 7 | 2010 年 1 月 3 日 |
| | 65 | 7 | 2020 年 5 月 20 日 |  
+---------------------------------+

最終的には、一人一人に最高額を返したいと思っています。それがうまくいかない場合は、日付を見て最新の日付を返したいと思います。

だから、私は私のクエリが返されるようにしたい:

+----------------------------------------+
| | person_id | 名前 | 金額 | 日付 |
+----------------------------------------+
| | 42 | ボブ | 4 | 2015 年 7 月 2 日 | (←最高額)
| | 65 | テッド | 7 | 2020 年 5 月 20 日 | (<- 最新の日付)
| | 99 | ストゥ| *ヌル* | *ヌル* | (<- Transactions テーブルにレコードがありません)
+----------------------------------------+

SELECT People.id, name, amount, date
FROM People
LEFT JOIN (
    SELECT TOP 1 person_id
    FROM Transactions
    WHERE person_id = People.id
    ORDER BY amount DESC, date ASC
)
ON People.id = person_id

何が間違っているのかわかりませんが、間違っていることはわかっています。どんな助けでも大歓迎です。

4

1 に答える 1

3

ほぼそこにいますが、Transactionテーブルに重複したIDがあるため、Row_number()関数を使用してそれらを削除する必要があります。これを試してください。

With cte as 
 (Select People,amount,date ,row_number() over (partition by People 
                                  order by amount desc, date desc) as row_num
  from Transac )
 Select * from People as a 
 left join cte as b
 on a.ID=b.People
 and b.row_num=1

結果はSQLフィドルにあります

編集:MSDNのRow_number()

Returns the sequential number of a row within a partition of a result set, 
starting at 1 for the first row in each partition.

パーティションは結果セットをグループ化するために使用され、Overby句が使用されます

Determine the partitioning and ordering of the rowset before the
associated window function is applied.
于 2012-07-25T03:42:37.147 に答える