TSQL 合并行值
TSQL Coalesce Row values
我目前有一个非常简单的查询,只需 SELECTs 并生成以下内容
| Date | Name | ID |
|------------|------------------|---------|
| 2018-11-07 | McDonald's | 1046226 |
| 2018-01-22 | NULL | 1046226 |
| 2019-01-07 | Dell | 1069285 |
| 2019-01-09 | Dell Corporation | 1069285 |
我想要做的是 SELECT 每个 ID 的最早日期行,使用 MIN
但我遇到的问题是,如果最早的行有一个 NULL 名称,我想从另一行合并它的名称
| Date | Name | ID |
|------------|------------------|---------|
| 2018-01-22 | McDonald's | 1046226 |
| 2019-01-07 | Dell | 1069285 |
我不知道这里是否有任何语法可以帮助我,有人可以帮忙吗?
与coalesce
:
select
min(t.date) Date,
coalesce(
(
select name from tablename where id = t.id and date = (
select min(date) from tablename where id = t.id
)
),
max(name)
) name,
t.id ID
from tablename t
group by t.id
通常,row_number()
用于此:
select t.*
from (select t.*, row_number() over (partition by id order by date) as seqnum
from <your query here> t
) t
where seqnum = 1;
更简单但速度稍慢的方法是:
select top (1) with ties . . .
from . . .
. . .
order by row_number() over (partition by id order by date)
使用 CTE 在 Azure SQL 数据仓库上测试的两种方法
;WITH cte AS
(
SELECT *, ROW_NUMBER() OVER( PARTITION BY ID ORDER BY [Date] ) rn
FROM #tmp
)
SELECT [Date], name, ID
FROM cte
WHERE rn = 1
或者,如果您想将剩余数据 CTAS 到一个新的 table,您可以在 Azure SQL 数据仓库中组合 CTE 和 CTAS,例如
CREATE TABLE dbo.yourNewTable
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = HASH( ID )
-- Optionally add partition scheme here if required
)
AS
WITH cte AS
(
SELECT
[Date],
MIN(Name) OVER( PARTITION BY ID ) name,
ID,
ROW_NUMBER() OVER( PARTITION BY ID ORDER BY [Date] ) rn
FROM dbo.yourTable
)
SELECT [Date], name, ID
FROM cte
WHERE rn = 1
OPTION ( LABEL = 'CTAS : Dedupe' );
请注意 RANK
和 ROW_NUMBER
的行为差异。
我目前有一个非常简单的查询,只需 SELECTs 并生成以下内容
| Date | Name | ID |
|------------|------------------|---------|
| 2018-11-07 | McDonald's | 1046226 |
| 2018-01-22 | NULL | 1046226 |
| 2019-01-07 | Dell | 1069285 |
| 2019-01-09 | Dell Corporation | 1069285 |
我想要做的是 SELECT 每个 ID 的最早日期行,使用 MIN
但我遇到的问题是,如果最早的行有一个 NULL 名称,我想从另一行合并它的名称
| Date | Name | ID |
|------------|------------------|---------|
| 2018-01-22 | McDonald's | 1046226 |
| 2019-01-07 | Dell | 1069285 |
我不知道这里是否有任何语法可以帮助我,有人可以帮忙吗?
与coalesce
:
select
min(t.date) Date,
coalesce(
(
select name from tablename where id = t.id and date = (
select min(date) from tablename where id = t.id
)
),
max(name)
) name,
t.id ID
from tablename t
group by t.id
通常,row_number()
用于此:
select t.*
from (select t.*, row_number() over (partition by id order by date) as seqnum
from <your query here> t
) t
where seqnum = 1;
更简单但速度稍慢的方法是:
select top (1) with ties . . .
from . . .
. . .
order by row_number() over (partition by id order by date)
使用 CTE 在 Azure SQL 数据仓库上测试的两种方法
;WITH cte AS
(
SELECT *, ROW_NUMBER() OVER( PARTITION BY ID ORDER BY [Date] ) rn
FROM #tmp
)
SELECT [Date], name, ID
FROM cte
WHERE rn = 1
或者,如果您想将剩余数据 CTAS 到一个新的 table,您可以在 Azure SQL 数据仓库中组合 CTE 和 CTAS,例如
CREATE TABLE dbo.yourNewTable
WITH
(
CLUSTERED COLUMNSTORE INDEX,
DISTRIBUTION = HASH( ID )
-- Optionally add partition scheme here if required
)
AS
WITH cte AS
(
SELECT
[Date],
MIN(Name) OVER( PARTITION BY ID ) name,
ID,
ROW_NUMBER() OVER( PARTITION BY ID ORDER BY [Date] ) rn
FROM dbo.yourTable
)
SELECT [Date], name, ID
FROM cte
WHERE rn = 1
OPTION ( LABEL = 'CTAS : Dedupe' );
请注意 RANK
和 ROW_NUMBER
的行为差异。