我需要能够在表的视图中第一次识别出一组行(问题集)。不确定如何清楚地构建问题所以将尝试在下面设置它。
示例数据
+-----------+------------+--------+------+----------+--------+
| 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上分组的第一个或最后一个参考?
答案 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
列不应该是一个问题。