【问题标题】:Counting rows iterativly that have a column correlation?迭代计算具有列相关性的行?
【发布时间】:2018-04-30 11:18:21
【问题描述】:

给定包含以下列的表:custID、startDate、endDate 等。

如何计算客户在同一时间段内生成的最大行数。

我的想法是,如果您执行递归 JOIN 并消除相同的行,您可以将 A.startDate 与 B 开始和结束日期进行比较。

我只是不明白如何执行这个迭代过程来找到可能的最高数字。

我现在拥有的东西看起来像这样,但它似乎没有按预期工作。

SELECT DISTINCT A.custID, COUNT(A.custID) AS Concurrently
FROM T_Loan A JOIN T_Loan B
WHERE A.custID = B.custID AND NOT (A.endDate = B.endDate AND A.loanDate = B.startDate) AND A.startDate<= B.endDate AND A.startDate>= B.startDate
GROUP BY custID
HAVING Concurrently > 0;

任何意见或建议将不胜感激

【问题讨论】:

  • SELECT B.custID, B.endDate AS 'end', B.startDate AS 'start', COUNT(*) FROM T_Loan A JOIN T_Loan B WHERE A.custID = B.custID GROUP BY B .endDate,B.startDate;目前,计数只是告诉我来自 custID 的条目数,但我在想如果我在计数中放置一个子查询,将该行与来自相应客户的所有可能行连接起来,并尝试在那里应用过滤器,我可能会得到东西。

标签: mysql subquery iteration conditional-statements


【解决方案1】:

我对查询中loanDatestartDate 的比较感到有些困惑,并且检查日期范围重叠似乎引用了错误的列。

假设(custid,startdate,enddate)T_Loan 中一行的唯一标识符...(理想情况下,我们将有一个列作为唯一标识符,例如,id 列作为代理主键)并假设我们只对所有三列都不为 NULL 的行感兴趣...

这些是一些很大的假设,但我们所要做的只是问题中提供的信息。

首先,我想知道如何计算T_Loan 中相同custid 的行数并且是并发的(也就是说,在开始/结束日期范围。)

为简单起见,我会继续将当前行包含在该计数中,因此将报告没有其他并发行的行,计数为 1(行本身)。以下是我的做法:

SELECT a.custid
     , a.startdate
     , a.enddate
     , COUNT(b.custid)  AS cnt_concurrent
  FROM T_Loan a
  JOIN T_Loan b
    ON b.custid     = a.custid
   AND b.enddate   >= a.startdate
   AND b.startdate <= a.enddate
 GROUP
    BY a.custid
     , a.startdate
     , a.enddate

这为我们提供了T_Loan 中的每一行T_Loan 中相同custid 的行数的计数,并且日期范围与当前行有一些重叠。

我们可以将该查询返回的结果集用作另一个查询中的行源。

例如,要获得每个custid 的最大并发行数,我们可以这样做:

SELECT c.custid
     , MAX(c.cnt_concurrent) AS max_cnt_concurrent
  FROM (
         SELECT a.custid
              , a.startdate
              , a.enddate
              , COUNT(b.custid)  AS cnt_concurrent
           FROM T_Loan a
           JOIN T_Loan b
             ON b.custid     = a.custid
            AND b.enddate   >= a.startdate
            AND b.startdate <= a.enddate
          GROUP
             BY a.custid
              , a.startdate
              , a.enddate
       ) c
 GROUP BY c.custid

这将包括在T_Loan 中只有一行的custid,以及有多行但在日期范围内没有重叠的custid。如果我们想消除那些行(最大并发数等于 1),我们可以添加一个HAVING 子句...

HAVING MAX(c.cnt_concurrent) > 1

此查询只是一种方法的示例;我们还可以使用其他方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多