SQL服务器 - 替换后使用最新值

时间:2014-01-21 14:26:36

标签: sql sql-server date

我有一张看起来像这样的表:

  • ID
  • create_date(存储为dateTime)

示例条目:

1,  '2012-12-01 00:00:00', 'retail'
1,  '1969-12-31 19:00:00', 'leisure and tourism'
1,  '2010-10-01 00:00:00', 'telesales'
2,  '2010-2-01 00:00:00', 'finance'
2,  '2010-2-01 00:00:00', 'retail'
2,  '2009-08-01 00:00:00', 'finance'

现在创建日期是最新的,如果创建日期是'1969-12-31',或者如果它不存在那么它就是最近的日期。因此,我将“1969-12-31”的任何日期更改为今天的日期。

但是现在我只想查看最近的日期值。

这似乎是一个棘手的问题,因为您必须处理转换以及转换后的订单然后选择第一个等级。还有一些人甚至不需要转换他们最近的日期,例如2。

我希望数据如下所示:

1,  '1969-12-31 19:00:00', ['leisure and tourism']
2,  '2010-2-01 00:00:00', ['finance', 'retail']

我一直在查看示例here,但它没有处理数据转换。另一个问题是当一个id有两个相同的最新create_date时,如id = 2所示,我们必须连接结果。

我还试图创建一个案例陈述来帮助转换:

CASE WHEN create_date = '1969-12-31 19:00:00' 
  THEN CONVERT(VARCHAR(19), GETDATE(),120)
  ELSE create_date --Format: yyyy-mm-dd hh:mi:ss
END AS createDate

请注意,我使用的是SQL Server。

1 个答案:

答案 0 :(得分:0)

declare @t table(id int, create_date datetime, industry varchar(50))

insert @t values(1,'20121201', 'retail')
insert @t values(1,'19691231', 'leisure and tourism')
insert @t values(1,'20101001', 'telesales')
insert @t values(2,'20100201', 'finance')
insert @t values(2,'20100201', 'retail')
insert @t values(2,'20090801', 'finance')



;with a as
(
  select id, industry, case when create_date = convert(datetime, '31/12/1969', 104)
  then current_timestamp else create_date end create_date, min(create_date) over (partition by id) chk,
  row_number() over (partition by id order by case when create_date = convert(datetime, '31/12/1969', 104) then 1 else 2 end, create_date desc) rn
  from @t
), b as
(
  select * from a
  where rn = 1 or chk <> convert(datetime, '31/12/1969', 104)
)
select b.id, max(create_date) create_date
,STUFF(( 
    select distinct  ',' + industry
    from b b1 
    where b1.id = b.id
    for xml path(''), type 
).value('.', 'varchar(max)'), 1, 1, '') [industries] 
from b
group by b.id 

id  create_date             industries
1   2014-01-21 16:36:41.010 leisure and tourism
2   2010-02-01 00:00:00.000 finance,retail