【问题标题】:Creating a "First" identifier in an SQL query在 SQL 查询中创建“第一个”标识符
【发布时间】:2015-03-29 18:58:23
【问题描述】:

我需要能够识别第一次出现在表格视图中的一组行、一个问题集。不确定如何清楚地提出问题,因此将尝试在下面列出。

示例数据

+-----------+------------+--------+------+----------+--------+
| 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     |
+-----------+------------+--------+------+----------+--------+

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

+-----------+------------+---------+-------+----------+--------+----------+--------+
| 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 |
+-----------+------------+---------+-------+----------+--------+----------+--------+

我在最早和最新都有这个,因为它可以让我撤回第一个完成的或最新的。通常,查询将只带回针对某人的一种类型的问题之一,无论是第一个完成的还是他最近完成的。拥有这两者当然可以选择带回最早或最新的选项,并查看两者之间的变化。

所以要尝试改写这个 - 我需要根据参考创建一个计数器,按 PerRef 和 QSet 分组,按日期排序(升序或降序)

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

【问题讨论】:

  • 如果有 3 个其他条目,例如 3_03/01/2015_a_QS1_... 最早的值是 2 还是 3?
  • 这应该是 3 - 我想它应该是一个序列号,但如果有意义的话,它会应用于 PerRef&Qset 的代理组。所以 4_03/01/2015_a_QS1_would 是 4 an 依此类推。

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


【解决方案1】:

我设法使用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.计算每个Reference/PerRef/Qset组合的Earliest
2.在Reference/PerRef/Qset上使用JOIN将其“应用”到每一行

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

【讨论】:

  • 感谢您的回复 - 我现在要到星期一才能尝试这个。快速提问。 #tmp_table 和 t - 是源表 (#tmp_table) 和在查询 (t) 中创建的虚拟表的这些名称。很抱歉问,但只是想清楚
  • 我不确定我是否理解您的问题,但t#tmp_table 的别名,这是我为您的Reference/ Date/PerRef/QSet/Question/Answer 表使用的名称,因为我不知道它的实际名称.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2011-08-18
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多