考慮無符號整數的索引列中的以下值:
1
2
3
3
2
4
6
8
9
對于提供的任何數字,我想獲得其連續范圍內的最大值(在下一個連續數字存在時繼續前進)。
例如,假設我們得到了輸入2;3和的連續值4確實存在于串列中(無論它們的順序如何),但5不存在;因此我們的連續范圍將是2,3,4;因此期望值是4: 在這個連續范圍內的最大值;提供了任何1,3或4, 也應該讓4. 因此:
input expected output
-------------------------------
1,2,3,4 4 -- any value of the input yields 4
5 5 -- the input value doesn't even exist in the list
6 6 -- it's the only value
7 7 -- the input value doesn't even exist in the list
8,9 9
那么,如何使用 MySQL 獲得任意連續范圍內的最大值呢?
uj5u.com熱心網友回復:
使用遞回 CTE:
WITH RECURSIVE cte AS (
SELECT x FROM tablename WHERE x = ?
UNION
SELECT t.x
FROM tablename t INNER JOIN cte c
ON t.x = c.x 1
)
SELECT COALESCE(MAX(x), ?) x FROM cte;
請參閱演示。
或者,使用DENSE_RANK()視窗函式:
SELECT COALESCE(MAX(CASE WHEN x = rn THEN x END), ?) x
FROM (
SELECT x, DENSE_RANK() OVER (ORDER BY x) ? rn
FROM tablename
WHERE x > ? AND EXISTS (SELECT * FROM tablename WHERE x = ?)
) t
請參閱演示。
替換為您想要?的input值。
uj5u.com熱心網友回復:
這可能是一個間隙隔離問題,可能需要使用視窗函式來解決和 CTE 遞回來解決它。
首先,我們可以嘗試使用 CTE 遞回生成器編號呼叫startnum范圍從最小的資料到最大的資料(從我們的樣本中是1, 9),因為它們之間有一些缺失的數字。
下一步,我們可能會計算一個grp即間隙和孤島問題的特征邏輯。
邏輯可能如下。
連續(重疊)資料是一組
(continuous range of sequence) - (values ??based on a certain order of conditions sequence)產生相同的分組。
所以我們可以使用
- 序列的連續范圍:startNum
- 基于一定順序的值:
dense_rank視窗函式。
使用這個邏輯,我們可能會得到一個grp列作為sqlfiddle
查詢 #1
WITH RECURSIVE cte AS(
SELECT MIN(val) startNum, MAX(val) endNum
FROM T
UNION ALL
SELECT startNum 1,endNum
FROM cte
WHERE startNum 1 <= endNum
)
SELECT GROUP_CONCAT(DISTINCT startNum) input,
MAX(startNum) 'expected output'
FROM (
SELECT val,
startNum ,
startNum - cast(dense_rank() OVER(ORDER BY val)as signed) grp
FROM cte t1
LEFT JOIN T t2
ON t1.startNum = t2.val
) t1
GROUP BY grp
ORDER BY 2;
| 輸入 | 預期產出 |
|---|---|
| 1,2,3,4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8,9 | 9 |
在 DB Fiddle 上查看
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471309.html
