我有一个我构建的查询,它从特定位置的多个表中提取数据,特定日期范围的计划中的特定约会类型。在返回的数据中,我提取服务的提供者,获得服务的成员以及描述成员或服务约会事项的许多字段。该信息将由提供商分组。因此,在此期间,您将为每个提供商提供多个成员/客户记录。
我现在被要求做的是取得这些结果,并仅为这些结果拉出最新的约会。
我的代码如下:
SELECT SCSERVICES.servicecode, SCSERVICES.servicename, SCSESSIONS.scheduleid, SCSERVICES.servicetype, SCSERVICECATEGORIES.servicecategory,
SCSCHEDULES.scheduledatefrom, MEMBERS.lname, MEMBERS.fname, SCSCHEDULES.timestart, SCSCHEDULES.schedulestatus,
CASE WHEN MEMBERS.phone1label = '4' THEN MEMBERS.phone1 WHEN MEMBERS.phone2label = '4' THEN MEMBERS.phone2 WHEN MEMBERS.phone3label = '4'
THEN MEMBERS.phone3 WHEN MEMBERS.phone4label = '4' THEN MEMBERS.phone4 END AS MobilePhone, MEMBERS.scancode,
EMPLOYEES.fname AS trainfname, EMPLOYEES.lname AS trainlname, MEMBERS.lastvisit
FROM SCSESSIONS INNER JOIN
SCSERVICES ON SCSESSIONS.serviceid = SCSERVICES.serviceid INNER JOIN
SCSERVICECATEGORIES ON SCSERVICES.servicecategoryid = SCSERVICECATEGORIES.servicecategoryid INNER JOIN
SCSCHEDULES ON SCSESSIONS.scheduleid = SCSCHEDULES.scheduleid INNER JOIN
MEMBERS ON SCSCHEDULES.memid = MEMBERS.memid INNER JOIN
SCSESSION_PROVIDERS ON SCSESSIONS.sessionid = SCSESSION_PROVIDERS.sessionid INNER JOIN
EMPLOYEES ON SCSESSION_PROVIDERS.employeeid = EMPLOYEES.employeeid
WHERE (SCSERVICECATEGORIES.servicecategory = 'Trainers' OR
SCSERVICECATEGORIES.servicecategory = 'Pilates' OR
SCSERVICECATEGORIES.servicecategory = 'Specialty') AND (SCSERVICES.siteid = @rvSite) AND (CAST(SCSCHEDULES.scheduledatefrom AS DATE) BETWEEN
@rvSessionDate AND @rvSessionDateEnd) AND (SCSCHEDULES.schedulestatus = '1') AND (SCSERVICES.servicecode <> 'BREAK')
结果看起来像这样:
答案 0 :(得分:2)
你可以使用row_number函数 (对于会员的最新预定会员)
select * from (
SELECT SCSERVICES.servicecode
, SCSERVICES.servicename
, SCSESSIONS.scheduleid
, SCSERVICES.servicetype
, SCSERVICECATEGORIES.servicecategory
, SCSCHEDULES.scheduledatefrom
, MEMBERS.lname
, MEMBERS.fname
, SCSCHEDULES.timestart
, SCSCHEDULES.schedulestatus
, CASE
WHEN MEMBERS.phone1label = '4'
THEN MEMBERS.phone1
WHEN MEMBERS.phone2label = '4'
THEN MEMBERS.phone2
WHEN MEMBERS.phone3label = '4'
THEN MEMBERS.phone3
WHEN MEMBERS.phone4label = '4'
THEN MEMBERS.phone4
END AS MobilePhone
, MEMBERS.scancode
, EMPLOYEES.fname AS trainfname
, EMPLOYEES.lname AS trainlname
, MEMBERS.lastvisit
, row_number() over ( partition by MEMBERS.memid order by SCSCHEDULES.scheduledatefrom desc) rowid
FROM SCSESSIONS
INNER JOIN SCSERVICES
ON SCSESSIONS.serviceid = SCSERVICES.serviceid
INNER JOIN SCSERVICECATEGORIES
ON SCSERVICES.servicecategoryid = SCSERVICECATEGORIES.servicecategoryid
INNER JOIN SCSCHEDULES
ON SCSESSIONS.scheduleid = SCSCHEDULES.scheduleid
INNER JOIN MEMBERS
ON SCSCHEDULES.memid = MEMBERS.memid
INNER JOIN SCSESSION_PROVIDERS
ON SCSESSIONS.sessionid = SCSESSION_PROVIDERS.sessionid
INNER JOIN EMPLOYEES
ON SCSESSION_PROVIDERS.employeeid = EMPLOYEES.employeeid
WHERE (
SCSERVICECATEGORIES.servicecategory = 'Trainers'
OR SCSERVICECATEGORIES.servicecategory = 'Pilates'
OR SCSERVICECATEGORIES.servicecategory = 'Specialty'
)
AND (SCSERVICES.siteid = @rvSite)
AND (
CAST(SCSCHEDULES.scheduledatefrom AS DATE) BETWEEN @rvSessionDate
AND @rvSessionDateEnd
)
AND (SCSCHEDULES.schedulestatus = '1')
AND (SCSERVICES.servicecode <> 'BREAK')
) x
where rowid = 1