Sql server SQL Server多表从多个表中查询特定日期

Sql server SQL Server多表从多个表中查询特定日期,sql-server,Sql Server,我有三张桌子: 表1-成员 Id Name 1 Member1 2 Member2 表2-活动 Id Member_id Activity Date 1 1 Activity1 2001-1-1 2 1 Activity2 2001-2-1 3 1 Activity3 2001-3-1 4 2 Test 2010-4-1 表3–详细信

我有三张桌子:

表1-成员

Id   Name
1    Member1
2    Member2
表2-活动

Id   Member_id   Activity    Date
 1      1        Activity1   2001-1-1
 2      1        Activity2   2001-2-1
 3      1        Activity3   2001-3-1
 4      2        Test        2010-4-1
表3–详细信息

Id  Activity_id Information
1   2       Information
根据以下内容,成员id 1有三个活动:

SELECT Member.id, COUNT(*) AS number
FROM Member 
INNER JOIN Activity ON Activity.Member_ID = Member.id
GROUP BY Member.id
我的问题是如何为表(1)中有2个活动的所有成员查找第二个活动(表2)的id和日期,并从表3中检索与此活动id相关的信息


提前感谢

行号功能将在这里帮助您

select *
from (
    select 
        *,
        rn = row_number() over (partition by member_id order by id)
    from
        activity
) activityWithRn
inner join detailed on detailed.activity_id = activityWithRn.id
where activityWithRn.rn = 2

在这里,我按成员id对数据进行了分区,并按活动id对活动进行了排序,但您可能希望按日期进行排序?

行数函数将在这里帮助您

select *
from (
    select 
        *,
        rn = row_number() over (partition by member_id order by id)
    from
        activity
) activityWithRn
inner join detailed on detailed.activity_id = activityWithRn.id
where activityWithRn.rn = 2

在这里,我已经按成员id对数据进行了分区,并按活动id对活动进行了排序,但您可能希望按日期进行排序?

同意@mouters的说法,
ROW_NUMBER()
函数在这里确实很有帮助。但我认为排名应该与@mouters的建议略有不同

以下是我尝试的解决方案:

WITH ranked AS (
  SELECT
    *,
    rn = ROW_NUMBER() OVER (PARTITION BY Member_id)
  FROM Activity
)
SELECT
  a.Member_id,
  number      = COUNT(*),
  Activity_id = MAX(d.Activity_id),
  Information = MAX(d.Information)
  Date        = MAX(CASE WHEN d.Id IS NOT NULL THEN a.Date)
FROM ranked a
  LEFT JOIN Detailed d ON a.Id = d.Activity_id AND a.rn = 2
GROUP BY a.Member_id

同意@mouters的观点,
ROW\u NUMBER()
函数在这里确实很有用。但我认为排名应该与@mouters的建议略有不同

以下是我尝试的解决方案:

WITH ranked AS (
  SELECT
    *,
    rn = ROW_NUMBER() OVER (PARTITION BY Member_id)
  FROM Activity
)
SELECT
  a.Member_id,
  number      = COUNT(*),
  Activity_id = MAX(d.Activity_id),
  Information = MAX(d.Information)
  Date        = MAX(CASE WHEN d.Id IS NOT NULL THEN a.Date)
FROM ranked a
  LEFT JOIN Detailed d ON a.Id = d.Activity_id AND a.rn = 2
GROUP BY a.Member_id


因此,在表
Activity
中,您有
Activity1
,在表
Detailed
中,您有编号作为
Activity\u id
(2)?您想按
member
Activity
分组还是只按
member id
分组?在表Activity中,第二个Activity\u id是2。感谢您的活动计数3是按成员列出的三个不同活动,您不能将其加入到详细信息表中,并且只能获取一个活动的信息。如果我按memeber和activity分组,则我将获得一个活动列表,而不是活动数。谢谢,在表
Activity
中,您有
Activity1
,在表
Detailed
中,您有编号作为
Activity\u id
(2)?您想按
member
Activity
分组还是只按
member id
分组?在表Activity中,第二个Activity\u id是2。感谢您的活动计数3是按成员列出的三个不同活动,您不能将其加入到详细信息表中,并且只能获取一个活动的信息。如果我按memeber和activity分组,则我将获得一个活动列表,而不是活动数。谢谢,当我在Activity.id=Detailed.Activity\u id上使用内部联接Detailed时,我得到以下错误:无法绑定多部分标识符“Activity.id”。请退出
activityWithRn
表,而不是
Activity
。基本上将
activityWithRn
视为您的
activity
表,但使用额外字段
rn
PS
partitionbymember\u id
是可选的,它充当每个成员的分组谢谢各位,这是我一直在寻找的解决方案。输出其他活动对(2)有效,但对(1)或(3)无效,然后我用一个活动添加了另一个成员。当我将2更改为1时,输出为空。如果我在detailed.Activity\u id=Activity\u id上更改了detailed;当我输入1时,它将列出2行,当将1更改为2或3时,它将列出一行。唯一的挑战是表详细信息中的信息不会更改!我希望您的帮助。您能更新您的问题以显示您期望的输出,可能使用更多示例数据(例如与不同成员一起)。谢谢,当我使用Activity.id=Detailed.Activity\u id上详细的内部连接时。我得到此错误:多部件标识符“Activity.id”无法绑定。请将
活动与rn
表连接,而不是
活动
。基本上将
activityWithRn
视为您的
activity
表,但使用额外字段
rn
PS
partitionbymember\u id
是可选的,它充当每个成员的分组谢谢各位,这是我一直在寻找的解决方案。输出其他活动对(2)有效,但对(1)或(3)无效,然后我用一个活动添加了另一个成员。当我将2更改为1时,输出为空。如果我在detailed.Activity\u id=Activity\u id上更改了detailed;当我输入1时,它将列出2行,当将1更改为2或3时,它将列出一行。唯一的挑战是表详细信息中的信息不会更改!我非常感谢您的帮助。您能否更新您的问题,以显示您期望的输出,也许可以使用更多的样本数据,例如不同成员的样本数据。