SQL Server - 高级分组

标签 sql sql-server sql-server-2008-r2

我的表格包含如下所示的采购契约(Contract):

+------+-----------+------------+---------+------------+-----------+
| type | text      | date       | company | supplierID | name      |
+ -----+-----------+------------+---------+------------+-----------+
| 0    | None      | 2004-03-29 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2007-09-30 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2010-11-29 | 310     | 227234     | HRC INFRA |
| 2    | Strategic | 2011-01-01 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2012-04-10 | 310     | 227234     | HRC INFRA |
+------+-----------+------------+---------+------------+-----------+

在此示例中,契约(Contract)的前三行是相同的。所以我只想要第一个。 type = 2 的行是与给定供应商的采购契约(Contract)的变更。我也想选择该行。 在最后一行,合约变回 0,因此我也想选择该行。

基本上我想选择第一行和契约(Contract)类型发生变化的行。所以结果应该是这样的:

+------+-----------+------------+---------+------------+-----------+
| type | text      | date       | company | supplierID | name      |
+ -----+-----------+------------+---------+------------+-----------+
| 0    | None      | 2004-03-29 | 310     | 227234     | HRC INFRA |
| 2    | Strategic | 2011-01-01 | 310     | 227234     | HRC INFRA |
| 0    | None      | 2012-04-10 | 310     | 227234     | HRC INFRA |
+------+-----------+------------+---------+------------+-----------+

对我如何实现这一目标有什么建议吗?

最佳答案

;WITH cte AS
 (
  SELECT ROW_NUMBER() OVER (ORDER BY date) AS Id,
         type, text, date, company, supplierId, name
  FROM your_table
  )
  SELECT c1.type, c1.text, c1.date, c1.company,
         c1.supplierId, c1.name
  FROM cte c1 LEFT JOIN cte c2 ON c1.id = c2.id + 1
  WHERE c2.text IS NULL OR c1.text != c2.text

演示 SQLFiddle

关于SQL Server - 高级分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13971420/

相关文章:

Java - 将 SQL 语句存储在外部文件中

sql - 从表中删除所有数据的最佳方法是什么?

mysql - SQL Server SELECT 以 Parameter 开头的行

使用 try..catch.. 时 SQL 事务不可提交。为什么?

sql-server - 如何找出哪个SQLDependency触发了更改函数?

php - sql注入(inject)改变返回值

mysql - 带有嵌套选择的sql插入语句

sql-server - 在 T-SQL 中获取基于货币的单个总金额

sql - 自连接查询

sql - 如何从没有输出参数的存储过程返回值