私はこの質問と答えに戻って戻ります。残念ながら、「ランキングのウィンドウ関数」を使用した移行が非常に複雑になる状況がいくつかあります。それらの状況は次のとおりです。
- さまざまな順序に基づくOracleクエリの選択部分の多くのKEEP-DENSE_RANK構造
 
- セット/ロールアップのグループ化によるグループ化
 
したがって、回答に追加情報を追加します。元のデータSQLFIDDLE:http ://sqlfiddle.com/#!6/e5c6d/6
1. oracle関数の読み取り:
select max(m.id), m.someId keep (DENSE_RANK FIRST ORDER BY m.UpdateDate desc) 
from MyTable m 
groupBy m.someId
そこで、グループ(someId、UpdateDate)で最大のm.idを選択します。ここで、UpdateDateはグループ(someId)で最大です。  
2.エラーのため、単純な方法が機能しません。列'MyTable.UpdateDate'は、集計関数またはGROUP BY句のいずれにも含まれていないため、選択リストでは無効です。
SELECT FIRST_VALUE(id) OVER(PARTITION BY someId ORDER BY UpdateDate DESC, id DESC) first_in_orderedset , someId
FROM MyTable
GROUP BY someId 
3.改善された「まっすぐ進む」は効果がありません
SELECT someId, MIN(first_in_orderedset)
FROM
 ( SELECT FIRST_VALUE(id) OVER(PARTITION BY someId ORDER BY UpdateDate DESC, id DESC) first_in_orderedset , someId
   FROM MyTable ) t
GROUP BY someId;
4.クロスアプライ:
SELECT grouped.someId, orderedSet.FirstUpdateDate, maxInSet.first_in_orderedset FROM
(
    SELECT mt.someId 
    FROM MyTable mt
    GROUP BY mt.someId
) grouped CROSS APPLY 
( 
   SELECT top 1 mt2.UpdateDate as FirstUpdateDate  
   FROM MyTable mt2 
   WHERE mt2.someId=grouped.someId  
   ORDER BY UpdateDate desc
) orderedSet  CROSS APPLY
( 
   SELECT max(mt3.id) as first_in_orderedset 
   FROM MyTable mt3 
   WHERE mt3.someId=grouped.someId  and mt3.UpdateDate=orderedSet.FirstUpdateDate  
) maxInSet;
5.次に、より複雑なテーブルとより複雑なクエリを取得しましょう。ORACLE:http ://sqlfiddle.com/#!4/c943c/23 
SQL SERVER:http ://sqlfiddle.com/#!6/dc7fb/1/ 0 
(データは事前に生成されており、両方のサンドボックスで同じです。結果を比較するのは簡単です)表:
CREATE TABLE AlarmReports (
  id int PRIMARY KEY,
  clientId int, businessAreaId int , projectId int, taskId int,  
    process1Spent int, process1Lag int, process1AlarmRate varchar2(1) null,
    process2Spent int, process2Lag int, process2AlarmRate varchar2(1) null,
    process3Spent int, process3Lag int, process3AlarmRate varchar2(1) null
)
Oracleクエリ:
SELECT clientId, businessAreaId, projectId, 
  sum(process1Spent),
  sum(process2Spent),
  sum(process3Spent),
  MIN(process1AlarmRate) KEEP (DENSE_RANK FIRST ORDER BY process1Lag DESC),
  MIN(process2AlarmRate) KEEP (DENSE_RANK FIRST ORDER BY process2Lag DESC),
  MIN(process3AlarmRate) KEEP (DENSE_RANK FIRST ORDER BY process3Lag DESC)
FROM AlarmReports 
GROUP BY GROUPING SETS ((),(clientId),(clientId, projectId),(businessAreaId),(clientId,businessAreaId))
SQLクエリ:
(to be continued)
実際には、c#で記述したカスタムアグリゲートを配置する予定です。誰かが興味を持っているなら、私に連絡してください...カスタムアグリゲートはそのような問題の最良の解決策ですが、varcharの長さの点で不自然ではありません。varcharの長さごとに、「特殊な」集計関数を作成する必要があります。