0

顧客のリスト、属性、および日付を含む一種の属性レコード テーブルがあります。このテーブルは、すべての顧客の現在の属性値で月に 1 回更新されます。

id     attr_val     date
1      red          2012-01-01
1      red          2012-02-01
1      blue         2012-03-01
2      green        2012-01-01
2      green        2012-02-01
2      green        2012-03-01

各属性値の開始日と終了日がリストされるように、このテーブルを再キャストまたは転置したいと考えています。そうすれば、任意の日付date between start_dt and end_dtを取得して、その日付の値を取得できます。

id     attr_val     start_dt       end_dt
1      red          2012-01-01     2012-02-28
1      blue         2012-03-01     NULL
2      green        2012-01-01     NULL

これは単一の SQL コマンドで可能ですか、それともより複雑なスクリプトを実行する必要がありますか? ターゲット環境は Teradata ですが、ソリューションはプラットフォームに依存しないと思います...

4

2 に答える 2

1

これに対する適切な解決策は、相関サブクエリです。

select id, attr_val, min(date) as start_date, end_date
from (select t.*,
             (select min(date) - 1 from t t2 where t2.id = t.id and t2.date > t.date and t2.attr_val <> t.attr_val
             ) as end_date
      from t
     ) t
group by id, attr_val, end_date

これは、指定された ID と属性値について、属性が異なる次の日付を計算します。この日付より 1 つ少ない日付が終了日です。特定の ID の属性が連続する行で同じ値を持つ場合、それらはすべて同じ end_date を取得します (NULL であっても)。次に、クエリはこの終了日を使用してそれらをグループ化します。

于 2013-01-15T19:55:38.167 に答える
1

これはおそらくあなたが望むものです

SELECT id, attr_val, min(date) as start_dt, max(date) as end_dt
FROM tablename
GROUP BY id, attr_val

またはこれ:

SELECT id, attr_val, min(date) as start_dt,CASE WHEN max(date) > min(date) THEN max(date) ELSE null END as end_dt
FROM tablename
GROUP BY id, attr_val
于 2013-01-15T19:50:29.823 に答える