Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中从单行中的多行获取列_Sql_Sql Server_Database_Tsql - Fatal编程技术网

如何在SQL中从单行中的多行获取列

如何在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

我想得到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
进行聚合,并为各种
列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字符串。