Sql 如何按特定属性进行查询和分组?
我在数据库中存储了一些数据,例如:Sql 如何按特定属性进行查询和分组?,sql,Sql,我在数据库中存储了一些数据,例如: id nid name 1 111 john 2 111 bill 3 222 tom 4 111 boy 5 111 girl 6 111 tim 7 333 jone 8 222 mike . . . 我需要查询所有id,然后按nid对所有id进行分组。预期的结果是 id nid name 1
id nid name
1 111 john
2 111 bill
3 222 tom
4 111 boy
5 111 girl
6 111 tim
7 333 jone
8 222 mike
. . .
我需要查询所有id,然后按nid对所有id进行分组。预期的结果是
id nid name
1 111 bill
3 222 tom
6 111 tim
7 333 jone
8 222 mike
我怎样才能在一个查询或任何想法中做到呢?哇,你是如何得到这个结果的?我看不到原始数据和结果数据之间有任何真正的相关性。如果要按NID进行分组,那么之后需要一个聚合函数,例如COUNT或SUM等。此外,如果数据库中的记录是1 | 111 | john,您怎么能期望1 | 111 | bill?我希望身份证应该和约翰在一起。希望我能提供帮助。当您分组并且不想从未分组的字段返回数据时,您必须决定要从每个组中选择哪个值。您可以使用“最小值”和“最大值”等委托来确定这一点,对于数值数据,还可以使用“平均值”和“计数”等委托 例如,此查询:
select min(id), nid, min(name)
from theTable
group by nid
order by nid
会给你这个结果:
id nid name
1 111 bill
3 222 mike
7 333 jone
请注意,nid列中的每个值只能得到一个组。记录仅基于值进行分组,而不是通过配对相邻记录进行分组
如果您希望在示例中得到准确的结果,那么分组不是您想要使用的。您必须使用光标,以便您可以单步浏览记录并决定如何处理每个记录。假设用户第一行的结果id为2,而不是id为1,并使用Oracle analytics:
SQL> select * from t1;
ID NID NAME
---------- ---------- ------------------------------
1 111 john
2 111 bill
3 222 tom
4 111 boy
5 111 girl
6 111 tim
7 333 jone
8 222 mike
SQL> select id, nid, name
2 from (select id, nid, name,
3 lead(nid) over (order by id) as next_nid
4 from t1 )
5 where next_nid <> nid
6 or next_nid is null;
ID NID NAME
---------- ---------- ------------------------------
2 111 bill
3 222 tom
6 111 tim
7 333 jone
8 222 mike
你的预期产出对我来说没有意义。对于name=bill,您的输入具有id=2。对于name=bill,预期输出的id=1?当按id排序时,他正在对连续的NID进行分组。哇,令人印象深刻的是,您注意到了这个标记。在这种情况下,仍然存在一个问题。以1 | 111 |比尔为例,这意味着NID 111的最低ID和最低名称。汤姆很好。但是,6 | 111 | tim说的是NID 111的最高ID和tim的最高名字。对我来说,这似乎真的不一致。