2011-01-10 3 views
0

私はTaskLogというテーブルを用意しています。それは持っているこれらの列(この質問の目的のために):それが実行されたホストの名前:SQLクエリのヘルプ - T.aの上位N個の値。T.b、T.cでグループ化されています。

  • TaskLogID:
  • ホスト名を実行したタスクのID:このレコード
  • タスクIDの一意のID
  • RunDate:タスクは
  • 出力を実行した日付と時刻:各TAの最新の実行からの出力を得るためには、この実行

の出力私ははるかに高速であるこの単一のクエリを働いまでSK、私は、複数のクエリを実行していた:

SELECT TaskLog.TaskID, TaskLog.HostName, TaskLog.Output 
FROM TaskLog 
INNER JOIN (
    SELECT TaskLogID, TaskID, HostName, MAX(RunDate) 
    FROM TaskLog 
    GROUP BY TaskID, HostName 
) AS Latest 
USING (TaskLogID) 

今、私は、各タスクの最後Nのランのそれぞれから出力を取得したいのですが、いくつかの固定のためにはNを実行してください。単一のクエリでこれを行う方法はありますか?

TIA

答えて

0

based on here)私はMySQLがこのマシンにインストールされていないとしてテストされていない

select TaskLogID, 
     TaskID, 
     HostName, 
     RunDate 
from (select TaskLogID, 
       TaskID, 
       HostName, 
       RunDate, 
       @num := if(@group = concat(TaskID, HostName), @num + 1, 1) as row_number, 
       @group := concat(TaskID, HostName) as dummy 
     from TaskLog) as x 
where row_number <= 5; 
+0

ありがとう、私はあなたの下にリンクされたWebページを読んだ後、同様のことを試しました。 –

0

などROW_NUMBER()などの窓関数のMySQLの不足が本当に痛いところです。

Select T.TaskLogId, T.TaskId, T.HostName, T.RunDate 
From TaskLog As T 
    Join (
      Select T1.TaskLogId 
       , (Select Count(*) 
        From TaskLog as T2 
        Where T2.TaskId = T1.TaskId 
         And T2.RunDate < T1.RunDate) + 1 As Rnk 
      From TaskLog As T1 
      ) As RankedTasks 
     On RankedTasks.TaskLogId = T.TaskLogId 
      And RankedTasks.Rnk <= <somevalue> 
Order By T.TaskId, T.RunDate 

ADDITION

TaskLogIdは、自動インクリメント列であると仮定すると、次のようなものにできる可能性があります(この例では、私はあなたが上位5項目を要求したと仮定):

Select T.TaskLogId, T.TaskId, T.HostName, T.RunDate 
From TaskLog As T 
    Join (
      Select Tasks1.TaskId 
       , (
        Select T4.TaskLogId 
        From TaskLog As T4 
        Where T4.TaskId = Tasks.TaskId 
        Order By T4.RunDate Desc 
        Limit 5, 1 
        ) As UpperTaskLogId 
      From (
        Select T3.TaskId 
        From TaskLog As T3 
        Group By T3.TaskId 
        ) As Tasks1 
      ) As LastId 
     On LastId.TaskId = T.TaskId 
      And LastId.UpperTaskLogId >= T.TaskLogId 
+0

それはうまくいくはずですが、私はそれが完了するのを待っています。 :-(私は複数のクエリよりも速い単一のクエリを探しています。 –

+0

@Ben Slusky - それは速く走ると約束していません:)。私はMySQLでLIMITステートメントを使用するより速く動くかもしれない別のソリューションを投稿しました。 – Thomas

+0

@Ben Slusky - Nm。 MySQLがサブクエリでLimitを正しく認識するとは思わない。 – Thomas

関連する問題