是否有where条件来比较拆分后的字符串值?
Is there a where condition to compare the value of the string after splitting?
数据库:SAP HANA
首先table为原始数据
原创
MATNR
EAU
QTY
1
30
1
1
30
50
2
70
1
2
70
50
2
70
100
3
10
1
group by后输出第二个table
输出(按 MATNR 分组)
MATNR
EAU
QTY
1
30
1, 50
2
70
1, 50, 100
3
10
1
第三个table是预期的结果
产量(其中 EAU > 第二个数量)
MATNR
EAU
QTY
2
70
1, 50, 100
有没有像WHERE SPLIT(QTY, ', ')[1] > EAU
这样的sql?
您没有指定您使用的是什么数据库,但一种方法是使用 row_number()
:
select matnr, eau,
listagg(qty, ', ') within group (order by qty)
from (select t.*,
row_number() over (partition by matnr order by qty) as seqnum
from t
) t
group by matnr, eau
having eau > sum(case when seqnum = 2 then qty end) ;
注意:这使用通用 SQL。确切的语法(特别是字符串聚合)取决于您使用的数据库。
有多种方法可以做到这一点。
- 在支持数组的DBMS中,可以在
HAVING
子句中使用ARRAY_AGG
取出
SELECT
t.MATNR,
t.EAU,
STRING_AGG(t.QTY, ',')
FROM YourTable t
GROUP BY
t.MATNR,
t.EAU
HAVING t.EAU > ARRAY_AGG(t.QTY ORDER BY t.QTY)[2];
- 您可以使用行编号解决方案
SELECT
t.MATNR,
t.EAU,
STRING_AGG(t.QTY, ',')
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY t.MATNR, t.EAU ORDER BY t.QTY) AS rn
FROM YourTable t
) t
GROUP BY
t.MATNR,
t.EAU
HAVING t.EAU > SUM(CASE WHEN t.rn = 2 THEN t.QTY END);
数据库:SAP HANA
首先table为原始数据
原创
MATNR | EAU | QTY |
---|---|---|
1 | 30 | 1 |
1 | 30 | 50 |
2 | 70 | 1 |
2 | 70 | 50 |
2 | 70 | 100 |
3 | 10 | 1 |
group by后输出第二个table
输出(按 MATNR 分组)
MATNR | EAU | QTY |
---|---|---|
1 | 30 | 1, 50 |
2 | 70 | 1, 50, 100 |
3 | 10 | 1 |
第三个table是预期的结果
产量(其中 EAU > 第二个数量)
MATNR | EAU | QTY |
---|---|---|
2 | 70 | 1, 50, 100 |
有没有像WHERE SPLIT(QTY, ', ')[1] > EAU
这样的sql?
您没有指定您使用的是什么数据库,但一种方法是使用 row_number()
:
select matnr, eau,
listagg(qty, ', ') within group (order by qty)
from (select t.*,
row_number() over (partition by matnr order by qty) as seqnum
from t
) t
group by matnr, eau
having eau > sum(case when seqnum = 2 then qty end) ;
注意:这使用通用 SQL。确切的语法(特别是字符串聚合)取决于您使用的数据库。
有多种方法可以做到这一点。
- 在支持数组的DBMS中,可以在
HAVING
子句中使用ARRAY_AGG
取出
SELECT
t.MATNR,
t.EAU,
STRING_AGG(t.QTY, ',')
FROM YourTable t
GROUP BY
t.MATNR,
t.EAU
HAVING t.EAU > ARRAY_AGG(t.QTY ORDER BY t.QTY)[2];
- 您可以使用行编号解决方案
SELECT
t.MATNR,
t.EAU,
STRING_AGG(t.QTY, ',')
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY t.MATNR, t.EAU ORDER BY t.QTY) AS rn
FROM YourTable t
) t
GROUP BY
t.MATNR,
t.EAU
HAVING t.EAU > SUM(CASE WHEN t.rn = 2 THEN t.QTY END);