我在查询的最后一步遇到问题,即选择一组行的所有行,这些行的混合值为 NATIONALITY 。
我尝试过为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
我正在尝试同时选择 X(s)和 Y(s)的组中的所有行
任何人都可以给我一些如何解决这个问题的提示吗?我真的不知道从哪里开始,分析函数没用,LEAD
函数没有为我服务,因为每组中的行数不固定,所以前导行可以有值 X ,但组中的值 Y ,因此在这种情况下,此组将被忽略,这在我的情况下是错误的。
答案 0 :(得分:3)
这里的一种方法是计算每个群体发生的不同国籍的数量,然后只保留那些具有一个以上不同国籍的群体。
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,我们可以修改此查询。
答案 1 :(得分:3)
我试图选择组中同时具有X(s)和Y(s)的所有行
将<DataGrid ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem}" AutoGenerateColumns="True" />
<Button Content="Do stuff" Command="{Binding DoWhateverCommand}" />
分析函数与it1[5]
语句一起使用,将计数限制为分区内的COUNT( ... ) OVER ( PARTITION BY ... )
或CASE
:
X
答案 2 :(得分: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.