【问题标题】:I am trying to bring back a row based on the minimum date, but not bring back the date field我正在尝试根据最短日期恢复一行,但不恢复日期字段
【发布时间】:2018-04-22 17:17:00
【问题描述】:
select customer_id, street_address, city, state, zip  
from customer  where min(date);  

【问题讨论】:

  • 你在用什么rdbms
  • 表中必须有customer id字段?
  • 欢迎您!为了使您的问题能够回答,请务必包括所有相关细节,包括您的表结构、相关数据库系统(Oracle、MySQL、MSSQL、DB2、HANA、HSQL 等)。您提供的详细信息越多,您的问题就会越快得到解答。还请仔细搜索您的问题可能已经回答的示例。
  • 你能分享你的表的架构吗?你有 id 列吗?
  • 我正在使用 Oracle,是的,有一个 customer_id 字段。所以正确的选择语句是:customer_id, select street_address, city, state, zip from customer where min(date);

标签: sql oracle greatest-n-per-group


【解决方案1】:

适用于每个 rdbms 的最简单的解决方案是:

select customer_id, street_address, city, state, zip 
from customer 
where date in (select min(date) from customer)
;

【讨论】:

    【解决方案2】:

    如果 Teradata:

    select customer_id, street_address, city, state, zip from customer 
    qualify row_number() over(partition customer_id order by date)=1
    

    其他选项:

    select customer_id,street_address, city, state, zip from customer a
    inner join (select customer_id, min(date) as min_date from customer group by customer_id) b
    on a.customer_id=b.customer_id and a.date=b.min_date
    

    【讨论】:

    • 对不起,我应该更具描述性。 “其他选项”带回我想要的数据,但只有一行。我对每个客户都有多个条目,并希望为每个最早日期的客户带回 1 行。您将如何更改它以恢复所有内容。谢谢!
    • aha :) 我不是很清楚,但您是否使用 Teradata?
    • 不,不使用 teradata。
    • 抱歉,这一切都匆匆忙忙...仍然犯了错误 - 我一直在加入客户,但没有客户字段 - 我假设每个客户都是通过街道地址、城市等来识别的,所以你必须在最后一行加入这些字段 - SORRYYY
    • 每个客户都有一个customer_id字段作为主键
    【解决方案3】:

    考虑到您正在 T-SQL 中尝试此操作。您可以尝试使用 CTE(公用表表达式)

    例子:

    select 'a123' street_address, 'as' city,'ap' state, 123456 zip, cast(getdate()-10 as date) [day] into #temp
    insert into #temp values('b12','ad','aw',345478,cast(getdate()-1 as date))
    insert into #temp values('c243','a2','a3',3458,cast(getdate()-12 as date))
    insert into #temp values('e3d','a2','af',8324,cast(getdate()-13 as date))
    insert into #temp values('f46','a3','ag',337,cast(getdate()-13 as date))
    insert into #temp values('g23','a4','ah',0374,cast(getdate()-1 as date))
    insert into #temp values('h12','af','aj',946,cast(getdate()-17 as date))
    insert into #temp values('634','ad','a8',345,cast(getdate()-17 as date))
    
    select * from #temp
    
    --Query to return min valued row
    ;with q as (select min(day) minday from #temp)
    select street_address, city, state, zip from #temp t cross apply q where t.day=q.minday
    

    阅读 CTE 的博客: https://www.red-gate.com/simple-talk/sql/t-sql-programming/sql-server-cte-basics/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多