web-dev-qa-db-ja.com

関係代数を使用して列内の個別のエントリをカウントする

これに似たテーブルがあります。各ユーザーが1つまたは複数のホテル(A、B、C、D)についてレビューを投稿しましたが、日付が異なるため、同じホテルを2回以上レビューした可能性がある場合でも、タプルの重複はありません。

[〜#〜]個別の[〜#〜]ホテルの数を数える必要がありますRELATIONAL ALGEBRAのみ。どうやってやるの?

enter image description here

使用する表記法を示す例:

R = ƔUser,COUNT(Hotel_reviewed)->Num_Reviews (InitialRelation- table 1) 

各ユーザーによるレビューの数を提供します

結果は次の表のようになります。

enter image description here

使用する表記法を示す例:

R = ƔUser,COUNT(Hotel_reviewed)->Num_Reviews (InitialRelation- table 1) 

各ユーザーによるレビューの数を提供します

1
Sreten Jocić

よりコンパクトな構文に加えて(@McNetsの回答から):

select   User,
         count(distinct Hotel_Reviewed) HotelsReviewed
from     InitialRelation
group by User;

また、最初に予測を行って、個別のUser、Hotel_Reviewedのペアを見つけ、次に集計することもできます。

select   User,
         count(Hotel_Reviewed) as Hotels_Reviewed
from     
    ( select distinct
               User,
               Hotel_Reviewed
      from     InitialRelation
    ) as D
group by User ;

これにより、リレーショナル代数表記につながります。

R = Ɣ User, COUNT(Hotel_Reviewed) -> Hotels_Reviewed 
        (π User, Hotel_Reviewed (InitialRelation)) -> D
3
ypercubeᵀᴹ

ユーザーごとにグループ化された個別のホテルを数えることで取得できます。

select   User,
         count(distinct Hotel_Reviewed) HotelsReviewed
from     your_table
group by User;
create table reviews([user] varchar(20), date_review date, hotel_reviewed varchar(10) );
insert into reviews values
('Joe',   '20170101', 'A'),
('Joe',   '20170201', 'A'),
('Tom',   '20170101', 'C'),
('Bryan', '20170101', 'B'),
('Bryan', '20170201', 'A'),
('Mike',  '20170101', 'B'),
('Mike',  '20170201', 'C'),
('Mike',  '20170301', 'D');
GO
select   [User],
         count(distinct Hotel_Reviewed) HotelsReviewed
from     reviews
group by [User];
GO
ユーザー| HotelsReviewed 
:- -------------:
ジョー| 1 
トム| 1 
ブライアン| 2 
マイク| 3 

dbfiddle ---(ここ

0
McNets