【问题标题】:SELECT TOP from each group从每个组中选择顶部
【发布时间】:2014-11-05 12:53:11
【问题描述】:

对不起,伙计们,我快要疯了……

我的桌子:

ID Name       Surname     Capital       Capital_Group   Job      Job_Group
----------    --------    -----------   -------------   ------   --------------
1  Michael    Jackson     LessThan50                             Entertainer
1  Michael    Jackson                    Medium                  Entertainer
2  John       Lennon                     Small                   Swimmer
3  Clara      Clinton                    Huge           Runner
3  Clara      Clinton                    Huge                    Sportsmen

我只想从每个 ID 中获取第一行但不基于任何内容,除了它出现在其余部分之上(它已经排序)。感谢任何帮助,我的理智受到威胁。

【问题讨论】:

  • 它是按什么排序的?
  • 好的,那么查询需要指定排序条件吗?该表是一个示例,它根据不同的标准进行排序。有没有可能只获得最高行?
  • 供您将来参考 - SQL 标准没有指定在表中按特定顺序存储行(实际上,实现可以随意存储行)。有很多原因表明,在任何给定的实现或时间中,这可能不是真的。如果您希望以特定顺序返回行,您必须使用ORDER BY。对于限制集合,需要预先订购其他技巧(例如在当前答案中使用<)。

标签: sql ms-access select


【解决方案1】:

假设您的表格按Capital 对每个id 进行降序排序,并且id 定义了一个组,则以下可能会满足您的需求:

select t.*
from mytable as t
where not exists (select 1
                  from mytable as t2
                  where t2.id = t.id and t2.capital > t.capital
                 );

【讨论】:

  • 我得到 'invalid argument to function with this query: SELECT t.* FROM qry_DD_Doubling as t WHERE NOT EXISTS (SELECT 1 FROM qry_DD_Doubling AS t2 WHERE t2.AC_ID = t.AC_ID)。有什么想法吗?
  • @Zenon 。 . .该查询中没有任何函数,因此错误消息非常混乱。
【解决方案2】:
SELECT t.*
FROM   mytable AS t
WHERE  t.capital = (SELECT MAX(capital)
                    FROM   mytable t2
                    WHERE  t2.id = t.id)

顺便问一下,如果有两个人的id和大写相同,你想怎么办?

【讨论】:

    【解决方案3】:
    with cte
    (
    select *, row_Number() over(Partition by ID order by Name ) as RowNumber
    )
    
    select * from cte
    where RowNumber=1
    

    试试这个,让我知道你的 cmets。

    【讨论】:

    • Access SQL 不支持 CTE 或 OVER (PARTITION BY ...)。 (Access 不使用 T-SQL。)
    【解决方案4】:
    SELECT  *
    FROM yourTable
    GROUP BY id
    HAVING MAX(Capital)
    

    【讨论】:

      【解决方案5】:
      select distinct ID ,Name ,Surname,Capital from mytable order by ID 
      

      【讨论】:

      • 基于 OP 表,这是行不通的,因为基于 ID、姓名、姓氏和大写字母有两条不同的 ID=1 记录。
      【解决方案6】:

      select *,row_number() over(order by ID) as RNO into #temp1

      select * from #temp as t where RNO not in (select max(RNO) from #temp as tt group by ID )

      我觉得对你有帮助

      【讨论】:

      • 这在 Access 中不起作用。 Access 不使用 T-SQL。
      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      相关资源
      最近更新 更多