【问题标题】:Between dates or latest value日期或最新值之间
【发布时间】:2018-05-16 13:53:44
【问题描述】:

我有以下表格:

当我加入 TableB 时,我需要一行 CID。

加入条件:

表 A CID Start_dt 在 AreaStart_dt 之间

如果上面不匹配,当tablea.cid = tableb.cid时使用最新的AreaStart_dt

表A

CID    Start_dt    End_dt
 1      1/1/18      
 2      5/1/18

表B

CID    Areaid    AreaStart_dt    Area_End_dt
 1      101         1/1/18         1/1/3000
 1      102         1/1/17         12/31/17
 2      201         4/1/18         4/29/18
 2      301         3/1/18         3/30/18

输出:

CID  Start_dt  End_dt   Areaid
 1     1/1/18            101
 2     5/1/18            201

SQL:

 SELECT *
 FROM TABLEA A
 LEFT JOIN (SELECT
            DENSE_RANK() OVER (PARTITION BY B.CID ORDER BY AREA_START_DT   DESC) RNK
            FROM TABLEB B
               )TABLEB B ON A.CID = B.ID BETWEEN B.AREASTART_DT 
               AND  B.AREA_END_DT OR A.CLIENTID = B.CLIENTID AND rnk = 1

【问题讨论】:

  • 到目前为止你有什么?
  • CID 上的左连接会返回所有结果,然后我创建了一个带有 case 语句的子查询来计算 areaid。
  • 更新以显示当前 SQL

标签: sql oracle


【解决方案1】:

我只会使用subquery条件 排序

select a.CID, a.Start_dt, a.End_dt, 
       (select Areaid
        from TableB b 
        where b.CID = a.CID
        order by (case when b.AreaStart_dt = t.Start_dt 
                       then 0 else 1 end), AreaStart_dt desc
        LIMIT 1 
        ) Areaid
from TableA a;

【讨论】:

  • 小事,但我认为 Oracle 不支持这样使用 LIMIT。
【解决方案2】:

我建议使用带有子查询的Union

SELECT *
FROM (
    SELECT * DENSE_RANK() OVER PARTITION BY CID
    ORDER BY QUERY
    FROM (
        SELECT * '1' AS QUERY
        FROM TABLEA A
        INNER JOIN TABLEB B ON A.CID = B.CID
            AND A.START_DT BETWEEN B.AREA_START_DT
                AND B.AREA_END_DT
        WHERE 1 = 1

        UNION

        SELECT *
            ,DENSE_RANK() OVER (
                PARTITION BY A.CID ORDER BY B.AREASTART_DT DESC
                ) AS RNK '2' AS QUERY
        FROM TABLEA A
        INNER JOIN TABLEB B ON A.CID = B.CID
            AND RNK = 1
        WHERE 1 = 1
        )
    )
WHERE 1 = 1
    AND RNK = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多