Sql 结合计数的内部联接

Sql 结合计数的内部联接,sql,sql-server,Sql,Sql Server,在我们的数据库中,我们有机组人员和非机组人员。每个船员和非船员都可以有朋友 例如,一名船员与4名船员和2名非船员成为朋友 我想知道的是非机组人员的平均数量,我们的机组人员的AirlineCode=LH 我们有两张桌子: AppUser:存储用户数据的位置 这是细胞 AppUser.IsCrew(0=非船员,1=船员) AppUser.AirlineCode(某种类型的sting) 追随者:朋友列表存储 Follower.FromUserId 杜塞里德 在那里,我们存储AppUser.Id=1有5

在我们的数据库中,我们有机组人员和非机组人员。每个船员和非船员都可以有朋友

例如,一名船员与4名船员和2名非船员成为朋友

我想知道的是非机组人员的平均数量,我们的机组人员的AirlineCode=LH

我们有两张桌子:

AppUser:存储用户数据的位置

这是细胞 AppUser.IsCrew(0=非船员,1=船员) AppUser.AirlineCode(某种类型的sting)

追随者:朋友列表存储

Follower.FromUserId 杜塞里德

在那里,我们存储AppUser.Id=1有5个朋友,并跟随Follower.ToUserId 3、4、5,依此类推

问题是,我甚至不知道如何开始:

查询哪些检查

a) 所有AppUser.IsCrew=1,且具有Airline.Code=LH b) 在Follower表中检查他们跟踪了多少用户,但只有AppUser.IsCrew中的ToUserId=0

然后返回一个平均数


非常感谢您的帮助

首先,您需要计算每个机组人员有多少非机组人员朋友。确保你也计算所有船员,即使他们没有朋友

然后是平均这些计数的问题。查询应该如下所示:

with x as (
select
    c.id, count(n.id) as nc_total
  from AppUser c
  left join Follower f on f.FromUserId = c.id
  left join AppUser n on f.ToUserId = n.id and n.isCrew = 0
  where c.isCrew = 1
    and c.AirLineCode = 'LH'    
  group by c.id    
)
select avg(nc_total) from x

具体的数据库引擎是什么?Oracle、PostgreSQL、DB2等。我们使用的是microsoft sql Server。表的设计非常不清楚,您能澄清一下并在问题中添加一些示例数据吗?非常感谢,这正是我需要的。一个问题:如果不考虑平均值,在表AppUser中我还有一个单元格“LastActivityDate”。如何从上述查询结果中“取消选择”所有活动日期晚于x的用户?@Andreas AppUser使用了两次。如果要为crewmember AppUser(
c
)添加额外的“过滤条件”,请将其添加到
WHERE
部分。可能类似于
和c.LastActivityDate
。但是,如果要将筛选条件添加到非乘员(
n
),请将其附加到该特定联接的
ON
子句中。