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)
有关如何实现这一目标的任何建议?
;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上的演示
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |