0

给定这样的数据:

SHQSCriteria            PropertyRef ReplacementYear
Energy Efficient            31          2014/15
Healthy, Safe & Secure      31          2012/13
Energy Efficient            462         2014/15
Healthy, Safe & Secure      462         2012/13
Free From Serious Disrepair 497         2012/13
Healthy, Safe & Secure      497         2012/13
Tolerable Standard          497         2012/13
Free From Serious Disrepair 498         2012/13
Healthy, Safe & Secure      498         2013/14
Tolerable Standard          498         2014/15

我想取出所有不符合一个以上标准的属性,以及它们不符合第二个标准的年份。

所以,我想要在上面的列表中至少出现两次的记录,但替换年份是按时间顺序排列的第二个年份。像这样:

PropertyRef ReplacementYear
   31           2014/15
   462          2014/15
   497          2012/13
   498          2013/14

请注意,在此示例中,属性 497 和 498 均不符合三个条件。497在同一年全部失败,所以我们应该在那一年返回。但是 498 在 3 个不同的年份都失败了,所以我们应该在第二年返回。

4

2 回答 2

2

您可以使用公用表表达式对每个 PropertyRef 中的年份进行排序(并对它们进行编号),然后将其连接回数据,为每个 PropertyRef 指定第二个:

WITH cte AS (
            SELECT  PropertyRef,
                    Years,
                    ROW_NUMBER() OVER (PARTITION BY propertyref ORDER BY years) as RowNumber
            FROM    data
)
SELECT      d.PropertyRef,
            cte.Years
FROM        data d
INNER JOIN  cte
ON          cte.PropertyRef = d.PropertyRef
AND         cte.RowNumber = 2
GROUP BY    d.PropertyRef,
            cte.Years
HAVING      COUNT(*) > 1
于 2013-02-19T15:36:45.657 回答
2

使用Sql-Server 2008 及更高版本CTE尝试此操作;row_number()

;with cte as (
  select propertyRef, replacementYear,
         row_number() over (partition by propertyref order by replacementYear) rn
  from table
)
select * from cte
where rn = 2
于 2013-02-19T15:42:55.863 回答