根据日期从每个客户的 table 中获取当前/最早的值?

Get current/ oldest values from a table for each customer based on dates?

我有一个 table 可以跟踪客户姓名、他们居住在美国哪个州以及何时搬到那里。这是创建它的示例代码:

DECLARE @Customers TABLE (Customer_Name VARCHAR(20), Residence_State VARCHAR(20), Move_In_Date DATE)

INSERT INTO @Customers VALUES
('Rachel', 'Wisconsin', '2010-01-01'),
('Rachel', 'Nevada', '2012-06-03'),
('Rachel', 'Arizona', '2018-02-01'),
('Chad', 'Texas', '2010-01-01'),
('Chad', 'Idaho', '2012-04-15'),
('Chad', 'Texas', '2019-11-17'),
('Jake', 'Illinois', '2010-01-01'),
('Jake', 'Florida', '2011-02-04'),
('Jake', 'Wisconsin', '2013-08-13'),
('Jake', 'California', '2016-01-15')

鉴于此 table,我想为每位客户获取一行,显示他们的姓名、已知最古老的居住州和当前居住州。所以对于上面的数据,那将是:

Rachel - Wisconsin - Arizona
Chad - Texas - Texas
Jake - Illinois - California

编写此查询的最有效方法是什么?

您的代码看起来像 SQL 服务器。不幸的是,没有 first() 聚合函数。但是你可以使用 first_value():

select distinct customer_name,
       first_value(residence_state) over (partition by customer_name order by move_in_date) as first_residence_state,
       first_value(residence_state) over (partition by customer_name order by move_in_date desc) as last_residence_state
from @customers c;

Here 是一个 db<>fiddle.

您也可以这样做 row_number() 和条件聚合:

select
    customer_name,
    max(case when rn_asc = 1 then residence_state end) first_residence_state,
    max(case when rn_desc = 1 then residence_state end) last_residence_state
from (
    select 
        c.*,
        row_number() over(partition by customer_name order by move_in_date asc) rn_asc,
        row_number() over(partition by customer_name order by move_in_date desc) rn_desc
    from @customers c
) c
where 1 in (rn_asc, rn_desc)
group by customer_name

内部查询按升序和降序move_in_date对每个customer_name的记录进行排序。然后外层查询按customer_name聚合,用条件表达式拉出每个客户第一个和最后一个move_in_date对应的residence_state

Demo on DB Fiddle:

customer_name | first_residence_state | last_residence_state
:------------ | :-------------------- | :-------------------
Chad          | Texas                 | Texas               
Jake          | Illinois              | California          
Rachel        | Wisconsin             | Arizona