1

次のように単純化されたテーブル構造があります。

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 か月空いていることを示しています)。

これはパーティションで実行できると確信していますが、これを実行しようとすると不足し、それらをよく理解していません。この問題に取り組むための知識に欠けているものは何ですか? データの説明が不十分で、何をしようとしているのかを理解するのが難しい場合は、お知らせください。できる限り詳しく説明します。

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 に答える