如何在SQL中从单行中的多行获取列
我想得到2列col_a和col_b的值,用于其他列的min和max。例如: 身份证件 上次更新 科鲁阿 科鲁布 1. 2021-01-01 abc xyz 1. 2021-01-02 abc_0 xyz_0 1. 2021-01-03 abc_1 xyz_1 1. 2021-01-04 abc_2 xyz_2 2. 2021-01-01 abc xyz 2. 2021-01-01 abc xyz ...如何在SQL中从单行中的多行获取列,sql,sql-server,database,tsql,Sql,Sql Server,Database,Tsql,我想得到2列col_a和col_b的值,用于其他列的min和max。例如: 身份证件 上次更新 科鲁阿 科鲁布 1. 2021-01-01 abc xyz 1. 2021-01-02 abc_0 xyz_0 1. 2021-01-03 abc_1 xyz_1 1. 2021-01-04 abc_2 xyz_2 2. 2021-01-01 abc xyz 2. 2021-01-01 abc xyz ... 对于每个id记录组,我们可以使用ROW\u NUMBER两次,按last\u updated
对于每个
id
记录组,我们可以使用ROW\u NUMBER
两次,按last\u updated
的顺序查找第一行和最后一行。然后,按id
进行聚合,并为各种列a
和列b
值透视出列
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY last_updated) rn_min,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY last_updated DESC) rn_max
FROM yourTable
)
SELECT
id,
MAX(CASE WHEN rn_min = 1 THEN col_a END) AS col_a_min,
MAX(CASE WHEN rn_max = 1 THEN col_a END) AS col_a_max,
MAX(CASE WHEN rn_min = 1 THEN col_b END) AS col_b_min,
MAX(CASE WHEN rn_max = 1 THEN col_b END) AS col_b_max
FROM cte
GROUP BY id;
对于每个
id
记录组,我们可以使用ROW\u NUMBER
两次,按last\u updated
的顺序查找第一行和最后一行。然后,按id
进行聚合,并为各种列a
和列b
值透视出列
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY last_updated) rn_min,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY last_updated DESC) rn_max
FROM yourTable
)
SELECT
id,
MAX(CASE WHEN rn_min = 1 THEN col_a END) AS col_a_min,
MAX(CASE WHEN rn_max = 1 THEN col_a END) AS col_a_max,
MAX(CASE WHEN rn_min = 1 THEN col_b END) AS col_b_min,
MAX(CASE WHEN rn_max = 1 THEN col_b END) AS col_b_max
FROM cte
GROUP BY id;
这不是最简单的解决方案,但演示了获取所需数据的另一种方法。我们将表本身连接起来,因为我们通常需要来自两行的数据,然后我们使用
交叉应用
将其限制为第一行和最后一行
select T1.id, T2.col_a, T1.col_a, T2.col_b, T1.col_b
from #my_table T1
inner join #my_table T2 on T1.id = T2.id
cross apply (
select id, max(last_updated) MaxLastUpdated, min(last_updated) MinLastUpdated
from #my_table
group by id
) X
where T1.last_updated = X.MaxLastUpdated and T2.last_updated = X.MinLastUpdated;
对于提供的示例数据,这似乎比
行编号()的解决方案执行得更差。最快的解决方案是分析函数。不是最简单的解决方案,而是演示了获取所需数据的另一种方法。我们将表本身连接起来,因为我们通常需要来自两行的数据,然后我们使用交叉应用
将其限制为第一行和最后一行
select T1.id, T2.col_a, T1.col_a, T2.col_b, T1.col_b
from #my_table T1
inner join #my_table T2 on T1.id = T2.id
cross apply (
select id, max(last_updated) MaxLastUpdated, min(last_updated) MinLastUpdated
from #my_table
group by id
) X
where T1.last_updated = X.MaxLastUpdated and T2.last_updated = X.MinLastUpdated;
对于提供的示例数据,这似乎比行编号()的解决方案执行得更差。最快的解决方案是分析函数。您可以使用MIN
和MAX
分析函数,如下所示:
select id,
max(case when mindt = last_updated then col_a end) as min_col_a,
max(case when maxdt = last_updated then col_a end) as max_col_a,
max(case when mindt = last_updated then col_b end) as min_col_b,
max(case when maxdt = last_updated then col_b end) as max_col_b
from
(select t.*,
min(last_updated) over (partition by id) as mindt,
max(last_updated) over (partition by id) as maxdt
from your_table t) t
group by id
您可以使用MIN
和MAX
分析功能,如下所示:
select id,
max(case when mindt = last_updated then col_a end) as min_col_a,
max(case when maxdt = last_updated then col_a end) as max_col_a,
max(case when mindt = last_updated then col_b end) as min_col_b,
max(case when maxdt = last_updated then col_b end) as max_col_b
from
(select t.*,
min(last_updated) over (partition by id) as mindt,
max(last_updated) over (partition by id) as maxdt
from your_table t) t
group by id
我如何在单独的列中获取这些内容?我已经更新了问题答案。你最初的问题让人觉得你想要一个CSV字符串。我如何在单独的列中获得这些字符串?我已经更新了问题答案。您最初的问题使您似乎想要一个CSV字符串。