2012-09-17 63 views
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日)。

不幸的是,如果租約空置兩個月,然後租用一個月,然後再空置兩個月(在出租前共有四個月,實際上應該是兩個空置) 。

我敢肯定這可以用分區來完成,但我已經試圖做到這一點,並不完全理解它們。我在解決這個問題方面缺少什麼?如果我已經解釋了數據不佳,所以很難理解我想要做什麼,請讓我知道,我會盡我所能詳細說明。

+0

如果套件在2011年7月1日之前空置,然後在該日期之後出租,該怎麼辦?在計算連續空置時間的數量時,2011年7月前的這些時間是否應包括在計數中? – MatBailie

+0

@Dems哦親愛的。我解釋得非常糟糕!基本上 - 我想顯示租賃自2011年7月1日至現在租賃之前租用的空置數量。當它們成爲活動租約時,只要在2011年7月1日(期間258) – Codingo

+0

之後提供並且沒有問題,那麼應該計算在7月1日之前空置的月數。只想知道在租賃前租賃空置了多少個月 – Codingo

回答

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 
+0

教我什麼,我需要知道把它拉掉 - 謝謝你 – Codingo

相關問題