0

SQLには、次のような粒度のデータがあります。

Person ID    Dish        Restaurant              Cost 
1            Pasta       The Spaghetti House     5
2            Burgers     Burger Factory          7
3            Pasta       The Spaghetti House     5
4            Pizza       The Cheesy Slice        4

これは単なる例ですが、私のデータの本質を捉え、良い例を提供します。このデータから、食事が料理、レストラン、コストで構成される「食事」(スーパーセット)を抽象化する必要があります。一意の「食事」IDを生成する必要があります。注意点は、私が人を食事に関連付ける必要があるということです。

PersonID    MealID        
1            1
2            2
3            1
4            3

これまでのところ、私が思いついた最善の解決策は、料理、レストラン、コストの列からチェックサムを生成することです。これにより、各「食事」を一意に識別し、行のチェックサムを計算して、各人を各食事に関連付けることができます。

私は、データのスーパーセットを抽出するこのプロセスが何と呼ばれるかさえ知りません。ましてや、それを正しく行う方法はわかりません。(私はこの質問のタイトルに苦労しました)。チェックサムを使用することが最もエレガントなオプションであるかどうかはわかりませんが、機能しているようです。

SQLで子(人)とその親(食事)の関係を維持しながら、データのスーパーセットを抽出するプロセスはありますか?

4

2 に答える 2

2

一意の料理ごとに一意の番号を作成するだけの場合は、Row_Numberを。とともに使用できます(select distinct dish)。次に、CTEを使用して料理に参加します。

これにより、個人ID 2と4が同じMealIDを共有することが保証されますが、順序は保証されません。

;with d as (select row_number() over (order by dish) MealID,
        Dish 
        from
        (select distinct dish
        From Data) as t)
Select [person Id],
       MealID
from data
      inner join d
      on data.dish = d.dish
Order by [person id]

デモ

同時にレストランでこれを行いたい場合は、別のcteを追加するだけです。

;with d as (select row_number() over (order by dish) MealID,
        Dish 
        from
        (select distinct dish
        From Data) as t)
, r as (select row_number() over (order by Restaurant) RestaurantID,
        Restaurant 
        from
        (select distinct Restaurant
        From Data) as t)

Select [person Id],
       MealID,
       RestaurantID
from data
      inner join d
      on data.dish = d.dish
      inner join r
      on data.restaurant = r.Restaurant
Order by [person id]

デモ

余談ですが、これらのctesをテーブルに配置すると、INSERTのOutput句が友だちになります。このプロセスは正規化と呼ばれます

于 2013-02-05T01:25:38.650 に答える
1

私は次のことがこれを行うと思います:

with mealids as (
    select t.*, row_number() over (order by (select NULL)) as mealid
    from (select distinct dish, restaurant, cost
          from t
         ) t
)
select t.personid, mealids.mealid 
from t join
     mealids
     on t.dish = mealids.dish and
        t.restaurant = mealids.restaurant and
        t.cost = mealids.cost

つまり、データ内の組み合わせのIDを生成します。次に、それらを元のデータに結合します。

于 2013-02-05T01:53:40.350 に答える