【发布时间】:2017-09-07 16:55:59
【问题描述】:
样本表
+--------+------------+------------------+-------------+-------------+
| FileID | Date | Activity | Assigned_By | Responsible |
+--------+------------+------------------+-------------+-------------+
| 123 | 2016/01/01 | Work in progress | Foo1 | Bob |
| 234 | 2016/01/01 | Work in progress | Foo2 | Smith |
| 123 | 2016/01/02 | Escalated | NULL | NULL |
| 123 | 2016/01/03 | Need reassign | NULL | NULL |
| 123 | 2016/01/03 | Reassigned | Foo2 | John |
| 234 | 2016/01/03 | Completed | NULL | NULL |
| 123 | 2016/01/04 | Completed | NULL | NULL |
+--------+------------+------------------+-------------+-------------+
我的查询:
SELECT FileID,
Date,
Activity,
Assigned_By,
Responsible
FROM (
SELECT fooTable.*, ROW_NUMBER() OVER (PARTITION BY FileID ORDER BY Date DESC) AS Separator
) fooTable
INNER JOIN randomTable ON fooTable.FileID = randomTable.ID
WHERE fooTable.Separator = 1;
返回:
+--------+------------+-----------+-------------+-------------+
| FileID | Date | Activity | Assigned By | Responsible |
+--------+------------+-----------+-------------+-------------+
| 234 | 2016/01/03 | Completed | NULL | NULL |
| 123 | 2016/01/04 | Completed | NULL | NULL |
+--------+------------+-----------+-------------+-------------+
期望的结果 - 返回具有最新 DATE 的每个唯一 FileID 的 LATEST 列记录的每一行:
+--------+------------+-----------+-------------+-------------+
| FileID | Date | Activity | Assigned By | Responsible |
+--------+------------+-----------+-------------+-------------+
| 234 | 2016/01/03 | Completed | Foo2 | John |
| 123 | 2016/01/04 | Completed | Foo1 | Bob |
+--------+------------+-----------+-------------+-------------+
我有点理解为什么查询不起作用,因为它只返回最新的行(由 row_number 分配 1),因此我将根据降序日期收到该唯一 FileID 的第一条 ROW 记录。但我不知道如何解决它。
编辑:我意识到的另一件事是 MAX() 不适用于 Assigned_By 和 Responsible(我认为),因为它会返回更大的字母名称......
【问题讨论】:
-
您需要为每个可为空的列多查询该表一次。您将对 FileID、Date、Activity 执行当前查询(假设 Activity 不可为空),然后离开加入另一个查询分配人和另一个查询负责人。附加查询将添加“WHERE {column} IS NOT NULL”的 where 子句。
标签: sql sql-server