次のように単純化されたテーブル構造があります。
period_id int
suite_id varchar(20)
suite_status varchar(50)
各月は期間 ID に割り当てられます。各スイートには、各月 (period_id) のレコードがあります。スイートのステータスは、「空き」または「アクティブ リース」のいずれかです。2011 年 7 月 1 日以降にリースされ、アクティブなリースになる前に最も長く空いていた上位 5 つの取引を表示するクエリを作成しようとしていますが、これにアプローチする方法がわかりません。
私の最初のアプローチは、次のように、空いている期間の数で各リースをランク付けすることでした。
;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 日) 以降にアクティブになったリースと相互参照することを計画していました。
残念ながら、これは、リースが 2 か月間空いていて、その後 1 か月リースされ、さらに 2 か月空いている場合には機能しません (実際には 2 か月になるはずのリース前に、合計 4 か月空いていることを示しています)。
これはパーティションで実行できると確信していますが、これを実行しようとすると不足し、それらをよく理解していません。この問題に取り組むための知識に欠けているものは何ですか? データの説明が不十分で、何をしようとしているのかを理解するのが難しい場合は、お知らせください。できる限り詳しく説明します。