【问题标题】:SQL - Select unique rows from a group of resultsSQL - 从一组结果中选择唯一的行
【发布时间】:2009-08-27 17:52:30
【问题描述】:

我已经为这个问题绞尽脑汁很久了。我还审查了其他问题,但没有成功。

我遇到的问题是,我有一个包含多行和列的结果/表列表

|注册 |身份证号    |日期           |单位类型

| 005DTHGP        |第172章2007-09-11 | MBio
| 005DTHGP        | 1966 | 2006-09-12 |追踪器
| 013DTHGP        |第2281章2006-11-01 |追踪器
| 013DTHGP        | 2712 | 2008-05-30 | MBio
| 017DTNGP        | 2404 | 2006-10-20 |追踪器
| 017DTNGP        |第508章2007-11-10 | MBio


我正在尝试选择具有唯一 REGISTRATIONS 且 DATE 最大(最新)的行。 ID 与 DATE 不成比例,这意味着 ID 可能是一个低值,但 DATE 高于其他匹配行,反之亦然。因此,我不能在 DATE 和 ID 上都使用 MAX() 并且分组似乎不起作用。

我想要的结果如下;

|注册 |身份证号    |日期           |单位类型

| 005DTHGP        |第172章2007-09-11 | MBio
| 013DTHGP        | 2712 | 2008-05-30 | MBio
| 017DTNGP        |第508章2007-11-10 | MBio

请帮忙!!!?!?!?!?!?!?

【问题讨论】:

  • 什么平台?这与我们可以提供的 SQL 有所不同

标签: sql


【解决方案1】:

您需要嵌入式查询,并非所有 SQL 都支持。在 t-sql 中你会有类似

select  r.registration, r.recent, t.id, t.unittype
from    ( 
    select  registration, max([date]) recent
    from    @tmp 
    group by 
        registration
    ) r
left outer join 
    @tmp t 
on  r.recent = t.[date]
and r.registration = t.registration 

【讨论】:

  • 谢谢。这是我在发布问题之前采取的路线。只是存在性能问题,因为我正在使用的数据是通过视图生成的,然后我假设这种方法实际上会创建另一个源/视图。我正在处理大约 9000 条记录。如果所有这些都可以在一行中完成,那就太好了。唉。谢谢
  • 视图肯定会很昂贵 - 考虑也许将所需数据的快照放入临时表/表变量中?
【解决方案2】:

TSQL:

declare @R table
(
Registration varchar(16),
ID int,
Date datetime,
UnitType varchar(16)
)

insert into @R values ('A','1','20090824','A')
insert into @R values ('A','2','20090825','B')

select R.Registration,R.ID,R.UnitType,R.Date from @R R
inner join
(select Registration,Max(Date) as Date from @R group by Registration) M
on R.Registration = M.Registration and R.Date = M.Date

如果您的表中有数千行取决于查询的执行方式(即,如果它是行扫描,然后是每行选择),这可能会降低效率。

【讨论】:

    【解决方案3】:

    在 PostgreSQL 中,假设您的数据已编入索引,因此不需要排序(或者您不介意排序的行太少):

    select distinct on (registration), * from whatever order by registration,"date" desc;
    

    按照注册的每一行和日期的降序排列,您将首先获得每个注册的最新日期。 DISTINCT 会丢弃随后的重复注册。

    【讨论】:

      【解决方案4】:
      select registration,ID,date,unittype
      from your_table
      where (registration, date) IN (select registration,max(date)
                                  from your_table
                                  group by registration)    
      

      【讨论】:

        【解决方案5】:

        这应该在 MySQL 中工作:

        SELECT registration, id, date, unittype FROM 
          (SELECT registration AS temp_reg, MAX(date) as temp_date 
          FROM table_name GROUP BY registration) AS temp_table
        WHERE registration=temp_reg and date=temp_date
        

        这个想法是在 FROM 子句中使用子查询,该子句会抛出包含正确日期和注册的单行(受组影响的字段);然后在 WHERE 子句中使用正确的日期和注册来获取同一行的其他字段。

        【讨论】:

        • 它不会给你一个最大日期的行的ID。
        • ... 和 ID + UnitType 列?
        猜你喜欢
        • 1970-01-01
        • 2021-02-14
        • 1970-01-01
        • 2021-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多