1

我有一个表结构,简化如下:

period_id int
suite_id varchar(20)
suite_status varchar(50)

每个月都分配给一个期间 ID。每个套件都有每个月的记录 (period_id)。套房状态可以是“空置”或“有效租约”。我正在尝试编写一个查询,显示自 2011 年 7 月 1 日以来已租用的前五项交易,这些交易在成为有效租约之前空置时间最长,但我不知道如何处理这个问题。

我最初的方法是按每个租约的空置期数对每个租约进行排名,如下所示:

;WITH cte_vacancy_periods AS
(
        SELECT  lp.suite_id ,
                count(lp.period_id) AS 'Periods Vacant'
        FROM    property.lease_period lp
        WHERE   lp.suite_status = 'Vacant'
                        OR
                        (       isnull(lp.suite_status, '') = ''
                                AND     lp.lease_id = 'No Lease'        )
        GROUP BY
                lp.suite_id
        ORDER BY count(lp.period_id) desc
)

然后,我计划将其与自 258 年(2011 年 7 月 1 日)以来生效的租约进行交叉引用。

不幸的是,这不适用于租约空置两个月,然后租用一个月,然后再空置两个月的情况(显示总共空置四个月,而实际上应该是两个月)。

我敢肯定这可以通过分区来完成,但我试图做到这一点并不太了解它们。我在解决这个问题时缺少什么知识?如果我对数据的解释很差,所以很难理解我在做什么,请告诉我,我会在可能的地方详细说明。

4

1 回答 1

1

希望这样的方法会有所帮助。

我不得不承认,我不是 100% 清楚您要寻找的最终结果,但这应该可以为您提供一个可以回答许多与您类似的问题的数据集。

WITH
  reformatted_data
AS
(
  SELECT
    suite_id,
    period_id,
    CASE
      WHEN suite_status = 'Vacant'                                 THEN 0
      WHEN lease_id = 'No Lease' AND isnull(suite_status, '') = '' THEN 0
                                                                   ELSE 1
    END as suite_status
  FROM
    properties.lease_period
)
,
  gaps_and_islands
AS
(
  SELECT
    suite_id,
    period_id,
    suit_status,
    ROW_NUMBER() OVER (PARTITION BY suite_id               ORDER BY period_id) AS seq,
    ROW_NUMBER() OVER (PARTITION BY suite_id, suite_status ORDER BY period_id) AS seq_status
  FROM
    reformatted_data
)

SELECT
  suite_id,
  suit_status,
  MIN(period_id)       AS first_period_id,
  MAX(period_id)       AS last_period_id,
  MAX(seq) - MIN(seq)  AS consecutive_periods
FROM
  gaps_and_islands
GROUP BY
  suite_id,
  suite_status,
  seq - seq_status
于 2012-09-17T07:57:12.010 回答