SQL Newbie - через раздел? - PullRequest
       9

SQL Newbie - через раздел?

0 голосов
/ 19 января 2019

У меня следующий запрос.Я пытаюсь увеличить число строк при изменении значения в поле Value1.Таблица SensorData содержит 2800 записей, а Value1 - 0 или 3 и меняется в течение дня.

SELECT 
    ROW_NUMBER() OVER(PARTITION BY Value1 ORDER BY Block ASC) AS Row#,
    GatewayDetailID, Block, Value1
FROM            
    SensorData
ORDER BY
    Row#

Я получаю следующие результаты:

enter image description here

Похоже, он создает только 2 раздела 0 и 3. Он не перезапускает номер строки каждый раз, когда изменяется значение 1 .?

1 Ответ

0 голосов
/ 19 января 2019

Сначала вместо создания постоянной таблицы я просто изменил ее на временную таблицу.

Итак, учитывая ваш пример, я пришел к следующему:

WITH CTE as(
select ROW_NUMBER() OVER(ORDER BY BLOCK) RN, LAG(Value1,1,VALUE1) OVER (ORDER BY BLOCK) LG, 
GatewayDetailID, Block, Value1,Value2,Vaule3
 from #tmp
), 
CTE2 as (
    select *, CASE WHEN LG <> VALUE1 THEN RN ELSE 0 END RowMark 
    from cte
    ), 
CTE3 AS (
    select MIN(Block) BL, RowMark from CTE2
    GROUP BY ROwMark
    ),
CTE4 AS (
    SELECT GatewayDetailID,Block,Value1,Value2,Vaule3,RMM from cte2 t1
    CROSS APPLY (SELECT MAX(ROWMark) RMM FROM CTE3 t9 where t1.Block >= t9.ROwMark and t1.RN >= t9.RowMark) t2
    )

SELECT GateWayDetailID,Block,Value1,Value2,Vaule3, ROW_NUMBER() OVER(Partition by RMM ORDER BY BLOCK) RN
FROM CTE4
ORDER BY BLOCK

Сначала у меня былочтобы получить номер строки для всех строк, затем, в зависимости от того, когда значение1 изменилось, я пометил это как новую группу.Из этого я создал CTE с датой и строкой границы для каждой группы.И, наконец, я перекрестно применил это обратно к таблице, чтобы найти каждую строку в каждой группе.

Из этого последнего CTE я просто применил простую функцию ROW_NUMBER (), разделенную на каждую группу RowMarker и номера строк poof ....

Возможно, есть лучший способ сделать это,но так я логично проработал проблему.

...