SQL Logic获取结果的最新记录

时间:2016-11-17 20:24:26

标签: sql sql-server

我有一个我构建的查询,它从特定位置的多个表中提取数据,特定日期范围的计划中的特定约会类型。在返回的数据中,我提取服务的提供者,获得服务的成员以及描述成员或服务约会事项的许多字段。该信息将由提供商分组。因此,在此期间,您将为每个提供商提供多个成员/客户记录。

我现在被要求做的是取得这些结果,并仅为这些结果拉出最新的约会。

我的代码如下:

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')

结果看起来像这样:

enter image description here

1 个答案:

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