2

我有两个表,我试图从中运行查询以返回每个人的最大(或最高)事务。我应该注意,我无法更改表结构。相反,我只能提取数据。

人们

+-----------+
| 编号 | 姓名 |
+-----------+
| 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 日 |  
+----------------------------------+

最终,对于每个人,我想返回最高金额。如果这不起作用,那么我想查看日期并返回最近的日期。

所以,我希望我的查询返回:

+--------------------------------------------------------+
| 人名 | 姓名 | 金额 | 日期 |
+--------------------------------------------------------+
| 42 | 鲍勃 | 4 | 2015 年 7 月 2 日 | (<- 最高金额)
| 65 | 特德 | 7 | 2020 年 5 月 20 日 | (<- 最近的日期)
| 99 | 斯图 | *空* | *空* | (<- 事务表中没有记录)
+--------------------------------------------------------+

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 Fiddle

编辑:来自 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.

Partition 用于对结果集进行分组,并使用 Over by 子句

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