首页 > 解决方案 > 如何将 Pivot 与 RowNumber 和日期一起使用

问题描述

我有一个这样的 SQL Server 表:

SQL 表

如何根据行号将阅读列更改为 2 列?

我试过这样:

WITH pivot_data AS
(
    SELECT 
        date, CurrentMeterSNID,
        1 + ((ROW_NUMBER() OVER (PARTITION BY CurrentMeterSNID ORDER BY date desc) - 1) % 2)  rownum,
        Reading
    FROM 
        INF_Facility_ElectricalRecord 
)
SELECT 
    date, CurrentMeterSNID, [1], [2]
FROM 
    pivot_data 
PIVOT 
    (MAX(Reading) FOR rownum IN ([1], [2])) AS p;

但我得到的结果是:

结果-图像

我得到空记录;如何用日期后一天的记录替换该空值?

标签: sql-serversql-server-2017

解决方案


只要您在该查询中显示每个日期,您就无法获得所需的内容。因此,您必须选择 max(date),换句话说,rownumber 将为 1。

WITH pivot_data AS(
   SELECT date,CurrentMeterSNID,
   1 + ((row_number() over(partition by CurrentMeterSNID ORDER by date desc) - 1) % 2)  rownum,
   Reading
   FROM dbo.Table_1 )
   , T2 AS
   (
SELECT CurrentMeterSNID, date, [1], [2]

FROM pivot_data PIVOT (max(Reading) FOR rownum IN ([1],[2])) AS p
)

SELECT CurrentMeterSNID,  Max(date), MAX([1]), Max([2]) 
FROM T2
GROUP BY CurrentMeterSNID

推荐阅读