2016-11-17 30 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