迭代计数具有列相关性的行?

时间:2017-11-16 19:38:21

标签: mysql subquery iteration conditional-statements

给定包含列的表: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;

非常感谢任何建议或建议

1 个答案:

答案 0 :(得分:1)

我对查询中for (int i = 0; i < headers.size(); i++){ combinedList.add(new HeadersWithData(headers.get(i), data.get(i))); } loanDate的比较感到有点困惑,检查日期范围重叠似乎引用了错误的列。

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

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

首先,我想弄清楚如何计算T_Loan中同一id并且是并发的行数(也就是&#39) ; s开始/结束日期范围内的任何重叠量。)

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

T_Loan

这为custid中的每一行提供了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的行数的计数,并且在日期中有一些重叠当前行的范围。

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

例如,要获取每个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 中的一行,以及custid,其中有多行,但日期范围内没有重叠。如果我们想要消除那些行(最大并发计数等于1),我们可以添加T_Loan子句......

custid

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