取100個asset_id(每個asset_id按順序排列好),每個asset_id上笛卡爾關聯10個account_id(每個account_id也按順序排列好,asset_id和account_id的關聯需要滿足一定條件)
即進行分組,每個asset_id為一組(組有順序要求),每組10條資料(也可能越往后滿足條件的條數越少)。
【要求】
1、asset_id和account_id的關聯需要滿足一定條件,不是純粹的全關聯;
2、按序號每組優先挑選滿足自己需要的account_id,每組10條資料中account_id不能出現前面的組里面已經存在的account_id。
請教一下各位大神,這個SQL要怎么寫。 我寫到下面就不知道該如何繼續了。
爲了簡化,可以忽略下面SQL語句WHERE後面的幾個條件
SELECT a.asset_id asset_id,
b.account_id account_id,
a.project_type project_type,
a.rnoA,
b.rnoB,
DENSE_RANK() OVER(ORDER BY a.rnoA) AS rn0,
ROW_NUMBER() OVER(PARTITION BY a.rnoA ORDER BY b.rnoB ASC) rn1
FROM (SELECT a.*, rownum AS rnoA
FROM (SELECT iaq.asset_id asset_id,
iaq.project_type project_type,
iaq.end_date asset_end_date,
iaq.rate asset_rate,
fla.create_time asset_create_time,
fla.loan_money - fla.already_money remain_money,
iaq.status,
fla.deadline deadline,
fla.user_id user_id
FROM intel_asset_queue iaq
LEFT JOIN fron_loan_application fla
ON fla.id = iaq.asset_id
WHERE 1 = 1
AND fla.inner_type = 0
AND iaq.ctr_status != 9
AND fla.loan_money >= fla.already_money
AND fla.loan_status = 4
AND fla.start_date < SYSDATE - 1
AND fla.end_date > SYSDATE
ORDER BY iaq.create_time ASC, --規則1+規則4
iaq.rate DESC --規則5
) a
WHERE rownum <= 100) a,
(SELECT b.*, rownum AS rnoB
FROM (SELECT ita.id account_id,
ita.usable_balance usable_balance,
ita.end_date account_end_date,
ita.create_time account_create_time,
ita.join_money account_join_money,
ita.ctr_status,
itp.deadline,
ita.user_id
FROM intel_tender_account ita
LEFT JOIN intel_tender_plan itp
ON itp.id = ita.plan_id
WHERE 1 = 1
AND ita.ctr_status != 9
AND ita.tender_start_date < SYSDATE - 1
AND ita.tender_end_date > SYSDATE
AND ita.usable_balance >= 100
ORDER BY ita.ctr_status DESC, ita.create_time) b
WHERE rownum <= 1000) b
WHERE 1 = 1
AND a.user_id != b.user_id
AND CASE
WHEN ABS(a.remain_money - b.usable_balance) = 0 THEN
1
WHEN ABS(a.remain_money - b.usable_balance) >= 100 THEN
1
WHEN ABS(a.remain_money - b.usable_balance) < 100 AND
a.remain_money > 2 * 100 AND b.usable_balance > 2 * 100 THEN
1
ELSE
0
END = 1
AND NOT EXISTS
(SELECT 1
FROM intel_tender_match_queue t
WHERE t.asset_id = a.asset_id
AND t.account_id = b.account_id
AND t.create_time > SYSDATE - (1 / 1440 * 3))
AND (a.deadline, b.deadline) IN
(SELECT DISTINCT ipr.asset_deadline, ipr.account_deadline
FROM intel_prematch_rule ipr
WHERE ipr.status = 1
AND (ipr.group_on_time IS NULL OR ipr.group_on_time < sysdate)
AND (ipr.group_off_time IS NULL OR ipr.group_off_time > sysdate));
uj5u.com熱心網友回復:
【簡化描述如下】從A表中取10個asset_id,每個asset_id笛卡兒積關聯2個account_id(存在順序要求),取不重復的資料。
詳細結果見期望結果
A表
ASSET_ID rownum
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
B表
ACCOUNT_ID rownum
1 1
2 2
3 3
4 4
5 5
笛卡兒積關聯
ASSET_ID ACCOUNT_ID
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
2 4
2 5
3 1
3 2
3 3
3 4
3 5
… ….
期望結果 1x2
ASSET_ID ACCOUNT_ID
1 1
1 2
2 3
2 4
3 5
uj5u.com熱心網友回復:
c1 c2--- ---
1 2
2 1
這兩條只保留一條資料嗎?
uj5u.com熱心網友回復:
是的。
uj5u.com熱心網友回復:
表 1 的資料是 1-10, 表 2 是 1-5, 但時結果中,最大的是 【3,5 】,其他的資料,依據什么規則不要了?轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/68202.html
標籤:開發
