SQL服务器 - 高级分组

tho*_*joh 5 sql sql-server sql-server-2008-r2

我在表中包含如下所示的采购合同:

+------+-----------+------------+---------+------------+-----------+
| 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 |
+------+-----------+------------+---------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)

在这个例子中,合约的前三行是相同的.所以我只想要第一个.type = 2的行是与给定供应商的采购合同的变更.我也想选择那一行.在最后一行,合约变回0,所以我也想选择那一行.

基本上我想选择第一行和合同类型更改的行.所以结果应该是这样的:

+------+-----------+------------+---------+------------+-----------+
| 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 |
+------+-----------+------------+---------+------------+-----------+
Run Code Online (Sandbox Code Playgroud)

有关如何实现这一目标的任何建议?

Ale*_*nko 1

;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
Run Code Online (Sandbox Code Playgroud)

SQLFiddle上的演示