给定包含列的表: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;
非常感谢任何建议或建议
答案 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
此查询只是一种方法的示例;我们可以使用其他方法。