创建一个" First" SQL查询中的标识符

时间:2015-01-30 10:12:27

标签: sql reporting-services sql-server-2012

我需要能够在表的视图中第一次识别出一组行(问题集)。不确定如何清楚地构建问题所以将尝试在下面设置它。

示例数据

+-----------+------------+--------+------+----------+--------+
| Reference |    Date    | PerRef | QSet | Question | Answer |
+-----------+------------+--------+------+----------+--------+
|         1 | 01/01/2015 | a      | QS1  | Q1       | A1     |
|         1 | 01/01/2015 | a      | QS1  | Q2       | A2     |
|         1 | 01/01/2015 | a      | QS1  | Q3       | A3     |
|         2 | 02/01/2015 | a      | QS1  | Q1       | A1     |
|         2 | 02/01/2015 | a      | QS1  | Q2       | A2     |
|         2 | 02/01/2015 | a      | QS1  | Q3       | A3     |
|         3 | 02/01/2015 | b      | QS2  | Q1       | A1     |
|         3 | 02/01/2015 | b      | QS2  | Q2       | A2     |
|         3 | 02/01/2015 | b      | QS2  | Q3       | A3     |
|         4 | 02/01/2015 | b      | QS3  | Q1       | A1     |
|         4 | 02/01/2015 | b      | QS3  | Q2       | A2     |
|         4 | 02/01/2015 | b      | QS3  | Q3       | A3     |
+-----------+------------+--------+------+----------+--------+

对于这个表,我想在select查询上生成一个新列,如下所示:

+-----------+------------+---------+-------+----------+--------+----------+--------+
| Reference |   Date     | PerRef  | QSet  | Question | Answer | Earliest | Latest |
+-----------+------------+---------+-------+----------+--------+----------+--------+
|         1 | 01/01/2015 | a       | QS1   | Q1       | A1     |        1 |      2 |
|         1 | 01/01/2015 | a       | QS1   | Q2       | A2     |        1 |      2 |
|         1 | 01/01/2015 | a       | QS1   | Q3       | A3     |        1 |      2 |
|         2 | 02/01/2015 | a       | QS1   | Q1       | A1     |        2 |      1 |
|         2 | 02/01/2015 | a       | QS1   | Q2       | A2     |        2 |      1 |
|         2 | 02/01/2015 | a       | QS1   | Q3       | A3     |        2 |      1 |
|         3 | 02/01/2015 | b       | QS2   | Q1       | A1     |        1 |      1 |
|         3 | 02/01/2015 | b       | QS2   | Q2       | A2     |        1 |      1 |
|         3 | 02/01/2015 | b       | QS2   | Q3       | A3     |        1 |      1 |
|         4 | 05/01/2015 | b       | QS3   | Q1       | A1     |        1 |      1 |
|         4 | 05/01/2015 | b       | QS3   | Q2       | A2     |        1 |      1 |
|         4 | 05/01/2015 | b       | QS3   | Q3       | A3     |        1 |      1 |
+-----------+------------+---------+-------+----------+--------+----------+--------+

我在最早和最新都有这个,因为它让我拉回第一个完成或最新。通常,查询将仅针对一个人带回一种类型的问题集,无论是第一个完成的还是最新的。拥有这两个当然会使选项能够带回最早的OR最新,并看到两者之间的变化。

所以试着改写一下 - 我需要创建一个基于Reference的计数器,按PerRef和QSet分组,按日期排序(升序或降序)

当然,如果有更好的方法请说明,因为我可能会使这个过于复杂 - 如果有办法选择在PerRef和Qset上分组的第一个或最后一个参考?

1 个答案:

答案 0 :(得分:0)

我设法找到了使用row_number()的解决方案:

SELECT t.*, orderT.Earliest
FROM #tmp_table t JOIN (SELECT Reference, PerRef, Qset, row_number() OVER (PARTITION BY PerRef, Qset order by Date ) as Earliest
                        FROM #tmp_table
                        GROUP BY Reference, Date, PerRef, Qset) orderT ON t.Reference = orderT.Reference
                                                                  AND t.PerRef = orderT.PerRef
                                                                  AND t.Qset = orderT.Qset

它的作用是:
 1.为每个Earliest / Reference / PerRef组合计算Qset列。  2."申请"使用JOIN / Reference / PerRef

Qset的每一行

如果您无法理解查询,请查看row_number()文档: https://msdn.microsoft.com/en-us/library/ms186734.aspx
使用类似的方法生成Latest列不应该是一个问题。