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的最高名字。对我来说,这似乎真的不一致。