Таблица обновления, имеющая отчетливые col1, Min (Col2) и Col3 на основе Col3 - PullRequest
1 голос
/ 03 февраля 2012

В моей таблице MeterReading у меня есть

-Id(Primary)
-ProjectMeterId
-MeterRead
-ReadDate
-ReadCount

У меня есть несколько записей для данного ProjectMeterId. Я хочу обновить ReadCount только тех строк, где ReadDate является минимальным (для данного ProjectMeterId), т.е.

  Update MeterReading
  set ReadCount = 1234
  where  (ReadDate is minimun for a given ProjectMeterId)

ПРИМЕЧАНИЕ. В таблице много ProjectMeterId, поэтому необходимо обновить несколько значений. Как я должен сделать это в запросе, без объявления каких-либо SP, объявления переменных таблицы и все ?? По этой причине обновление всех записей занимает более 10 минут.

Вот что я сейчас делаю:

 UPDATE TTable
SET TTable.ReadCount= 222   
From
(
  Select * From MeterReading where Id in 
  (
     Select Id From
     (
        SELECT Min(Id)as Id, MIN(ReadDate) as ReadDate, ProjectMeterId  FROM MeterReading 
        WHERE ProjectMeterId IS NOT NULL AND ProjectId IS NOT NULL Group By ProjectMeterId 
     )  as temp1
 )
 ) TTable, 

(
     Select * From MeterReading where Id in
          (
        Select Id From 
         (
        SELECT MIN(ReadDate) as ReadDate, ProjectMeterId  FROM MeterReading 
        WHERE ProjectMeterId IS NOT NULL AND ProjectId IS NOT NULL Group By ProjectMeterId 

     ) as temp2
   )
) STable

Where STable.ProjectMeterId = TTable.ProjectMeterId

но Min (id) внутри subQueries дает мне ту строку, которая имеет минимальный Id, специфичный для ProjectMeterId, а не ReadDate.

Что мне делать?

1 Ответ

0 голосов
/ 03 февраля 2012
;WITH CTE
     AS (SELECT *,
                MIN(ReadDate) OVER (PARTITION BY ProjectMeterId) AS Mn
         FROM   MeterReading)
UPDATE CTE
SET    ReadCount = 1234
WHERE  ReadDate = Mn  

Или

UPDATE m1
SET    ReadCount = 1234
FROM   MeterReading m1
WHERE  NOT EXISTS(SELECT *
                  FROM   MeterReading m2
                  WHERE  m1.ProjectMeterId = m2.ProjectMeterId
                         AND m2.ReadDate < m1.ReadDate)  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...