2009-07-09 2 views
1

maxDateを含むテーブルのidフィールドに関連する必要があるため、このクエリをOVER(PARTITION BY ...)で最適化しようとすると問題が発生します。もう一つのテーブル。他のテーブルエンティティに関連するMAXの日付クエリをoptmizeするには

作業クエリは次のとおりです。

SELECT maxReadDate, Equip.idProtocol 
     FROM Equip, 
     ( 
      SELECT idEquip as idEquipTot, MAX(readDate) AS maxReadDate 
      FROM Totalizer 
      WHERE Totalizer.idEquip = xxx 
      GROUP BY idEquip 
    ) 
     WHERE Equip.idEquip = idEquipTot 

私がやろうとしていますどのようなものに近いものですが、それはうまくいきませんでした:

SELECT maxReadDate, Equip.idProtocol 
     FROM Equip, 
     ( 
      SELECT idEquip as idEquipTot, MAX(readDate) OVER (PARTITION BY idEquip) maxReadDate 
      FROM Totalizer 
    ) 
     WHERE Equip.idEquip = idEquipTot 
     AND Equip.lastReadDate = maxReadDate 
     AND idEquipoTot = xxx 

感謝。

ソリューション:

SELECT DISTINCT e.idProtocol, e.idEquip, MAX(t.readDate) 
     OVER (PARTITION BY e.idEquip) maxReadDate 
FROM Equip e 
JOIN Totalizer t 
ON  t.idEquip = e.idEquip 
WHERE e.idEquip = ? 
+0

はあなたには、いくつかのサンプルデータを提供してもらえグループ化使用していないと、結果セットはあなたが取得したいのですが? – Quassnoi

答えて

2
SELECT e.idProtocol, e.idEquip, MAX(t.readDate) OVER (PARTITION BY e.idEquip) maxReadDate 
FROM Equip e 
JOIN Totalizer t 
ON  t.idEquip = e.idEquip 
+0

良いソリューションですが、そのようにして実際に装備テーブル全体を検索する前にあらかじめ選択されている最大の日付がありますか?私は、ネイティブ・ジョインまたはサブ・セレクトを行うのではなく、分析関数を使用することを考えていました。 乾杯。 – lucasarruda

+0

おそらくそこにはDISTINCTが必要です。 –

+0

はい、別名も必要です。 私が必要としたのは、すべての最大日付を列挙するのではなく、1つの特定の装置からの最大日付です。 DISTINCTをフィルタリングして追加すると機能しました。 ありがとうございます。溶液の上方: はDISTINCT e.idProtocolを選択e.idEquip、MAX(t.readDate) OVER(e.idEquip BY PARTITION)maxReadDate 装備Eからは t.idEquip = e.idEquip ON積算T をJOINどこでe.idEquip =? – lucasarruda

0

あなたは必要分析関数がちょうど

SELECT e.idProtocol, e.idEquip, MAX(t.readDate) as maxReadDate 
FROM Equip e 
JOIN Totalizer t 
ON  t.idEquip = e.idEquip 
WHERE e.idEquip = ? 
group by e.idProtocol, e.idEquip 
+0

しかし、私が望んでいたのは、既に各機器からMAX readDateをあらかじめ選択しておくことでした。私は各機器から正確な記録を返すだけです。ですから、この意味では、各機器/プロトコル/データをグループ化する必要はなく、プロトコルごとに最後の読み取りを取得する必要があります。 – lucasarruda

関連する問題