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' );

请注意 RANKROW_NUMBER 的行为差异。