创建一个;“第一”;SQL查询中的标识符
我需要能够识别表视图中第一次出现的一组行,一个问题集。不确定如何清楚地界定问题,因此将尝试在下面列出 示例数据创建一个;“第一”;SQL查询中的标识符,sql,reporting-services,sql-server-2012,Sql,Reporting Services,Sql Server 2012,我需要能够识别表视图中第一次出现的一组行,一个问题集。不确定如何清楚地界定问题,因此将尝试在下面列出 示例数据 +-----------+------------+--------+------+----------+--------+ | Reference | Date | PerRef | QSet | Question | Answer | +-----------+------------+--------+------+----------+--------+ |
+-----------+------------+--------+------+----------+--------+
| 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 |
+-----------+------------+---------+-------+----------+--------+----------+--------+
我有这两个最早和最新的,因为它然后让我回拉第一个完成或最新的。通常情况下,查询将仅返回针对某人的一类问题中的一类,无论是第一个完成的问题还是最新的问题。当然,拥有这两个选项将使您能够返回最早或最晚的版本,并看到两者之间的变化
因此,为了尝试重新表述这一点,我需要根据引用创建一个计数器,按PerRef和QSet分组,按日期排序(升序或降序)
当然,如果有更好的方法,请说明,因为我可能会使这过于复杂-如果有方法选择PerRef和Qset上分组的第一个或最后一个引用?我使用
行数()找到了解决方案。
:
它的作用是:1.为每个
引用计算最早的列/PerRef
/Qset
组合
2.使用Reference
/PerRef
/Qset
如果您在理解查询时遇到困难,请查看行编号()
文档:
使用类似的方法生成最新的列应该不会有问题。如果还有3个其他条目,如3\u 03/01/2015\u a\u QS1\u。。。最早的值是2还是3?应该是3-我想应该是一个序列号,但如果有意义的话,它会应用于PerRef&Qset的代理分组。因此,4_03/01/2015_a_QS1_将是4 an So。感谢您的回复-我要到周一才能尝试。快速提问。#tmp_表和t-是源表(#tmp_表)和在查询(t)中创建的虚拟表的名称。很抱歉问您,但我只是想澄清一下,我不确定是否理解您的问题,但是t
是#tmp_表的别名
,这是我为您的Reference/Date/PerRef/QSet/question/Answer
表使用的名称,因为我不知道它的实际名称。
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