5

Loans次の表を想像してください。

BorrowerID       StartDate         DueDate
=============================================
1                2012-09-02        2012-10-01
2                2012-10-05        2012-10-21
3                2012-11-07        2012-11-09
4                2012-12-01        2013-01-01
4                2012-12-01        2013-01-14
1                2012-12-20        2013-01-06
3                2013-01-07        2013-01-22
3                2013-01-15        2013-01-18
1                2013-02-20        2013-02-24

BorrowerID一度に 1 つのローンしか利用したことがない人から、個別の を選択するにはどうすればよいでしょうか? これには、ローンを 1 回しか借りたことのない借り手も、2 回以上借りたことのある借り手も含まれます。たとえば、上の表では、借り手 1 と 2 のみが検索されます。

テーブルをそれ自体に結合して実験してみましたが、実際にはどこにも到達できませんでした。どんなポインタでも大歓迎です!

4

4 に答える 4

1

私はそれを機能させましたが、少し複雑な方法でした。最初に内部クエリの基準を満たさない借り手を取得し、残りを返します。内部クエリには 2 つの部分があります。

同じ日に開始されないすべての重複借入を取得します。

同じ日付から始まるすべての借入を取得します。

select distinct BorrowerID from borrowings
where BorrowerID NOT IN

(
    select b1.BorrowerID from borrowings b1
    inner join borrowings b2
        on b1.BorrowerID = b2.BorrowerID
        and b1.StartDate < b2.StartDate
        and b1.DueDate > b2.StartDate

    union 

    select BorrowerID from borrowings
    group by BorrowerID, StartDate
    having count(*) > 1
)

b1.StartDate <= b2.StartDateテーブルには各レコードの一意の識別子がなく、必要に応じて使用すると、レコードがそれ自体に結合されるため、2 つの個別の内部クエリを使用する必要がありました。レコードごとに個別の識別子があるとよいでしょう。

于 2013-10-13T22:57:13.543 に答える
0

試す

with cte as 
(
    select *, 
      row_number() over (partition by b order by s) r
      from loans
 )

select l1.b
from loans l1
except
select c1.b
from cte c1
where exists (
    select 1
    from cte c2 
    where c2.b = c1.b
    and c2.r <> c1.r
    and (c2.s between c1.s and c1.e
             or c1.s between c2.s and c2.e)
 )
于 2013-10-14T00:05:12.677 に答える