如何使用 SQL Oracle 中的 listagg 函式來消除彼此相鄰的值?只要資料不相鄰,資料就可以重復。
例子:
SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',')
FROM tablename;
但我有價值:
蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 蘋果, 梨, 蘋果, 橙子, 橙子, 橙子, 橙子, 橙子, 葡萄, 葡萄, 蘋果, 葡萄
如何安排 sql 以獲得這樣的值(重復但不相鄰)。預計:
蘋果, 梨, 蘋果, 橙子, 葡萄, 蘋果, 葡萄
任何的想法?
uj5u.com熱心網友回復:
您可以使用:
SELECT LISTAGG(colname, ',') WITHIN GROUP (ORDER BY ROWNUM)
AS items
FROM (
SELECT colname,
LAG(colname) OVER (ORDER BY ROWNUM) AS prev_colname,
ROWNUM AS rn
FROM tablename
)
WHERE rn = 1
OR prev_colname <> colname
或者,從 Oracle 12:
SELECT LISTAGG(colname, ',') WITHIN GROUP (ORDER BY ROWNUM)
AS items
FROM (
SELECT colname,
ROWNUM AS rn
FROM tablename
)
MATCH_RECOGNIZE(
ORDER BY rn
MEASURES
FIRST(colname) AS colname
PATTERN (same )
DEFINE same AS FIRST(colname) = colname
);
(注意:ROWNUM應替換為能夠識別行中確定性排序的列,例如時間戳或 id 列;但是,此類列不存在于您的示例資料中,因此無法使用。ROWNUM只會對行進行編號按照 SQL 引擎處理它們的順序,并且處理順序可能是不確定的。)
其中,對于樣本資料:
CREATE TABLE tablename (colname) AS
SELECT 'apple' FROM DUAL CONNECT BY LEVEL <= 8 UNION ALL
SELECT 'pear' FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 'apple' FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 'orange' FROM DUAL CONNECT BY LEVEL <= 5 UNION ALL
SELECT 'grape' FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT 'apple' FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 'grape' FROM DUAL CONNECT BY LEVEL <= 1;
兩個輸出:
專案 蘋果,梨,蘋果,橙色,葡萄,蘋果,葡萄
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/417696.html
標籤:
上一篇:創建觸發器以將新值插入表中
