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 回答