我有一张看起来像这样的表:
示例条目:
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。
答案 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