如果列数据不同,则获取组的行
Get rows of group if column data is different
我在查询的最后一步遇到问题,即 select 一组行中的所有行,这些行具有名为 NATIONALITY[= 的列的混合值38=].
我已经尝试为 NATIONALITY 列提供一个数字表示形式,1 表示 X,0 表示其他国籍,然后在组上使用 MIN
MAX
,如此 example,但是,我无法找到一种方法来获取组中具有该性质数据的所有行
查看下面的示例进行说明:
排序后的数据和处理后的数据如下所示:
GROUP_ID VALUE_1 VALUE_2 ..... VALUE_N NATIONALITY
------------------------------------------------------------
1 282 8383 383 X
1 737 722 712 Y
1 273 7123 123 Y
2 347 234 235 X
2 8723 274 474 Y
3 747 23 623 X
4 133 1823 612 Y
4 747 533 100 Y
5 343 2383 213 X
5 333 123 711 X
5 312 344 766 X
5 456 6003 190 Y
目标结果:
GROUP_ID VALUE_1 VALUE_2 ..... VALUE_N NATIONALITY
------------------------------------------------------------
1 282 8383 383 X
1 737 722 712 Y
1 273 7123 123 Y
2 347 234 235 X
2 8723 274 474 Y
5 343 2383 213 X
5 333 123 711 X
5 312 344 766 X
5 456 6003 190 Y
我正在尝试 select 具有 X(s) 和 Y(s) 的组中的所有行同时
谁能告诉我如何解决这个问题?我真的不知道从哪里开始,分析函数没有用,LEAD
函数没有为我服务,因为每组中的行数不固定,所以前导行的值可能是 X,但是组中它后面的是Y,所以在这种情况下这个组将被忽略,这在我的情况下是错误的。
这里的一种方法是计算每个组出现的不同国籍的数量,然后只保留那些具有多个不同国籍的组。
SELECT
t.GROUP_ID,
t.VALUE_1,
t.VALUE_2,
...,
t.VALUE_N,
t.NATIONALITY
FROM
(
SELECT *,
COUNT(DISTINCT NATIONALITY) OVER (PARTITION BY GROUP_ID) distinct_count
FROM yourTable
) t
WHERE t.distinct_count > 1
当然,此查询将任何 两个不同的国籍计算为对您的结果集有效。如果您确实需要显式检查 X 和 Y,我们可以修改此查询。
I am trying to select all rows within a group that has X(s) and Y(s) at the same time
使用带有 CASE
语句的 COUNT( ... ) OVER ( PARTITION BY ... )
分析函数将计数限制为仅 X
s 或 Y
s 在分区内:
SELECT *
FROM (
SELECT t.*,
COUNT( CASE nationality WHEN 'X' THEN 1 END )
OVER ( PARTITION BY group_id ) AS x,
COUNT( CASE nationality WHEN 'y' THEN 1 END )
OVER ( PARTITION BY group_id ) AS y
FROM your_table t
)
WHERE x > 0 AND y > 0
在 Oracle 12c 中,MATCH_RECOGNIZE
子句可以非常快速干净地解决这个问题。
with
test_data ( group_id, value_1, value_2, value_n, nationality ) as (
select 1, 282, 8383, 383, 'X' from dual union all
select 1, 737, 722, 712, 'Y' from dual union all
select 1, 273, 7123, 123, 'Y' from dual union all
select 2, 347, 234, 235, 'X' from dual union all
select 2, 8723, 274, 474, 'Y' from dual union all
select 3, 747, 23, 623, 'X' from dual union all
select 4, 133, 1823, 612, 'Y' from dual union all
select 4, 747, 533, 100, 'Y' from dual union all
select 5, 343, 2383, 213, 'X' from dual union all
select 5, 333, 123, 711, 'X' from dual union all
select 5, 312, 344, 766, 'X' from dual union all
select 5, 456, 6003, 190, 'Y' from dual
)
-- End of test data (not part of the solution). SQL query begins BELOW THIS LINE.
select *
from test_data
match_recognize (
partition by group_id
all rows per match
pattern ( a*? ( x a*? y | y a*? x ) a* )
define x as nationality = 'X',
y as nationality = 'Y'
)
;
输出:
GROUP_ID VALUE_1 VALUE_2 VALUE_N NATIONALITY
-------- --------- --------- --------- -----------
1 282 8383 383 X
1 737 722 712 Y
1 273 7123 123 Y
2 347 234 235 X
2 8723 274 474 Y
5 343 2383 213 X
5 333 123 711 X
5 312 344 766 X
5 456 6003 190 Y
9 rows selected.
我在查询的最后一步遇到问题,即 select 一组行中的所有行,这些行具有名为 NATIONALITY[= 的列的混合值38=].
我已经尝试为 NATIONALITY 列提供一个数字表示形式,1 表示 X,0 表示其他国籍,然后在组上使用 MIN
MAX
,如此 example,但是,我无法找到一种方法来获取组中具有该性质数据的所有行
查看下面的示例进行说明:
排序后的数据和处理后的数据如下所示:
GROUP_ID VALUE_1 VALUE_2 ..... VALUE_N NATIONALITY
------------------------------------------------------------
1 282 8383 383 X
1 737 722 712 Y
1 273 7123 123 Y
2 347 234 235 X
2 8723 274 474 Y
3 747 23 623 X
4 133 1823 612 Y
4 747 533 100 Y
5 343 2383 213 X
5 333 123 711 X
5 312 344 766 X
5 456 6003 190 Y
目标结果:
GROUP_ID VALUE_1 VALUE_2 ..... VALUE_N NATIONALITY
------------------------------------------------------------
1 282 8383 383 X
1 737 722 712 Y
1 273 7123 123 Y
2 347 234 235 X
2 8723 274 474 Y
5 343 2383 213 X
5 333 123 711 X
5 312 344 766 X
5 456 6003 190 Y
我正在尝试 select 具有 X(s) 和 Y(s) 的组中的所有行同时
谁能告诉我如何解决这个问题?我真的不知道从哪里开始,分析函数没有用,LEAD
函数没有为我服务,因为每组中的行数不固定,所以前导行的值可能是 X,但是组中它后面的是Y,所以在这种情况下这个组将被忽略,这在我的情况下是错误的。
这里的一种方法是计算每个组出现的不同国籍的数量,然后只保留那些具有多个不同国籍的组。
SELECT
t.GROUP_ID,
t.VALUE_1,
t.VALUE_2,
...,
t.VALUE_N,
t.NATIONALITY
FROM
(
SELECT *,
COUNT(DISTINCT NATIONALITY) OVER (PARTITION BY GROUP_ID) distinct_count
FROM yourTable
) t
WHERE t.distinct_count > 1
当然,此查询将任何 两个不同的国籍计算为对您的结果集有效。如果您确实需要显式检查 X 和 Y,我们可以修改此查询。
I am trying to select all rows within a group that has X(s) and Y(s) at the same time
使用带有 CASE
语句的 COUNT( ... ) OVER ( PARTITION BY ... )
分析函数将计数限制为仅 X
s 或 Y
s 在分区内:
SELECT *
FROM (
SELECT t.*,
COUNT( CASE nationality WHEN 'X' THEN 1 END )
OVER ( PARTITION BY group_id ) AS x,
COUNT( CASE nationality WHEN 'y' THEN 1 END )
OVER ( PARTITION BY group_id ) AS y
FROM your_table t
)
WHERE x > 0 AND y > 0
在 Oracle 12c 中,MATCH_RECOGNIZE
子句可以非常快速干净地解决这个问题。
with
test_data ( group_id, value_1, value_2, value_n, nationality ) as (
select 1, 282, 8383, 383, 'X' from dual union all
select 1, 737, 722, 712, 'Y' from dual union all
select 1, 273, 7123, 123, 'Y' from dual union all
select 2, 347, 234, 235, 'X' from dual union all
select 2, 8723, 274, 474, 'Y' from dual union all
select 3, 747, 23, 623, 'X' from dual union all
select 4, 133, 1823, 612, 'Y' from dual union all
select 4, 747, 533, 100, 'Y' from dual union all
select 5, 343, 2383, 213, 'X' from dual union all
select 5, 333, 123, 711, 'X' from dual union all
select 5, 312, 344, 766, 'X' from dual union all
select 5, 456, 6003, 190, 'Y' from dual
)
-- End of test data (not part of the solution). SQL query begins BELOW THIS LINE.
select *
from test_data
match_recognize (
partition by group_id
all rows per match
pattern ( a*? ( x a*? y | y a*? x ) a* )
define x as nationality = 'X',
y as nationality = 'Y'
)
;
输出:
GROUP_ID VALUE_1 VALUE_2 VALUE_N NATIONALITY
-------- --------- --------- --------- -----------
1 282 8383 383 X
1 737 722 712 Y
1 273 7123 123 Y
2 347 234 235 X
2 8723 274 474 Y
5 343 2383 213 X
5 333 123 711 X
5 312 344 766 X
5 456 6003 190 Y
9 rows selected.