2016-11-17 57 views
0

我有一个查询,我构建的数据从特定位置的多个表中拉回,特定日期范围的计划中的特定约会类型。在返回的数据中,我拉动了服务的提供者,获取服务的成员以及描述有关成员或服务约会的一些字段。信息将由提供者分组。因此,您将在该期间为每个提供商提供多个成员/客户记录。用于获取结果的最新记录的逻辑

什么我现在被要求做的是把这些结果和拉只对这些结果的最新任命。

我的代码如下:

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

+0

'ORDER BY SCSCHEDULES.schedu ledatefrom DESC'和'TOP 1'? – Hackerman

+0

从这里添加一个外部选择并选择您想要的任何内容并在条件中使用。按递减顺序使用,并获得最高1 选择(经柱递减粘贴你上面的查询顺序)顶部1 –

+0

请考虑[如何创建一个最小的,完整的,并且可验证的示例](http://stackoverflow.com /帮助/ MCVE)。 你也许会发现[RANK窗口函数](https://msdn.microsoft.com/en-us/library/ms176102.aspx)有用。 –

回答

2

您可以使用ROW_NUMBER函数,该函数 (对于最新scheduledatefrom的成员)

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 
+0

当我实现建议的代码时,我收到以下错误:“OVER SQL构造或语句不受支持。” – Merlin

+0

你有哪些sql server? row_number函数可从sql server 2008中获得。 – Kostya

+0

我正在使用SQL 2008.如果您不介意,对行号的语法有一点帮助会大大帮助。谢谢! – Merlin