代码之家  ›  专栏  ›  技术社区  ›  kazzi

联接子查询并提取最近日期

  •  2
  • kazzi  · 技术社区  · 6 年前

    我有两张桌子:

    客户

    ID   NAME
    001  John
    002  Sara
    

    客户端\u状态

    CLIENT_ID   STATUS   DATE
    001         3        2018-01-02
    001         2        2018-01-04
    002         2        2018-01-02
    002         1        2018-01-03
    

    status = 1 我只想要指定时间范围内的最新日期。

    DECLARE 
        @StartDate  DATE,
        @EndDate    DATE
    SET @StartDate  = '2016-07-01'    
    SET @EndDate    = '2018-06-30'    
    
    SELECT 
       c.NAME
     , c.ID
     , cs.STATUS
    FROM CLIENT c
    LEFT JOIN (
        SELECT cs.CLIENT_ID, cs.DATE 
        FROM CLIENT_STATUS 
        WHERE STATUS = 1 AND h.DATE BETWEEN @StartDate AND @EndDate
    ) AS hst ON hst.CLIENT_ID = c.ID
    

    2 回复  |  直到 6 年前
        1
  •  2
  •   Salman Arshad    6 年前

    与具有行号的子查询左(或内)联接:

    SELECT *
    FROM CLIENTS
    LEFT JOIN (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY CLIENT_ID ORDER BY DATE DESC) AS rn
        FROM CLIENT_STATUS
        WHERE STATUS = 1
    ) RECENT_STATUS ON CLIENTS.ID = RECENT_STATUS.CLIENT_ID AND RECENT_STATUS.rn = 1
    
        2
  •  1
  •   Yogesh Sharma    6 年前

    你可以用 row_number()

    SELECT TOP (1) WITH TIES c.ID, c.NAME, cs.DATE
    FROM CLIENT c INNER JOIN
         CLIENT_STATUS cs
         ON cs.CLIENT_ID = c.ID 
    WHERE cs.STATUS = 1 AND cs.DATE >= @StartDate AND cs.DATE <= @EndDate
    ORDER BY ROW_NUMBER() OVER (PARTITION BY c.ID ORDER BY cs.DATE DESC);