【问题标题】:Join subquery and pull most recent date加入子查询并提取最近的日期
【发布时间】:2018-09-20 14:56:59
【问题描述】:

我有两张桌子:

客户

ID   NAME
001  John
002  Sara

CLIENT_STATUS

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

只有不按最近日期订购。

请注意,这是更大查询的一部分。

【问题讨论】:

  • “我只想要状态表 = 1 并且我想要指定日期范围内的最新日期” -- 这没有意义对我来说,您能否将您想要的输出添加到您的问题中?
  • 哇,我在说什么......语法A+......我会重写它

标签: sql sql-server tsql date


【解决方案1】:

左(或 INNER)连接与具有行号的子查询:

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】:

    你可以使用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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-14
      • 2017-10-02
      • 2022-01-24
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多