2011-01-12 3 views
0
SELECT s1.ID FROM binventory_ostemp s1 JOIN 
(SELECT Cust_FkId, ProcessID, MAX(Service_Duration) AS duration 
FROM binventory_ostemp WHERE ProcessID='4d2d6068678bc' AND Overall_Rank IN 
(
    SELECT MIN(Overall_Rank) FROM binventory_ostemp WHERE ProcessID='4d2d6068678bc' GROUP BY Cust_FkId 
) 
GROUP BY Cust_FkId 
) AS s2 ON s1.Cust_FkId = s2.Cust_FkId AND s1.ProcessID=s2.ProcessID 
AND s1.Service_Duration=s2.duration AND s1.ProcessID='4d2d6068678bc' 
GROUP BY s1.Cust_FkId 

Он просто уходит, если в этой таблице содержится более 10 тыс. Строк. То, что он делает, это найти строки для каждого клиента, у которого мин. общего ранга и в тех макс. продолжительности службы для данного ProcessIdКак я могу переписать этот запрос для более быстрого выполнения

ID Cust_FkId Overall_Rank Service_Duration ProcessID 
1  23  2   30    4d2d6068678bc 
2  23  1   45    4d2d6068678bc 
3  23  1   60    4d2d6068678bc 
4  56  3   90    4d2d6068678bc 
5  56  2   50    4d2d6068678bc 
6  56  2   85    4d2d6068678bc 

значения ID Результат Результат данных

Таблица данных должны быть и только

+0

Я предполагаю, что вы имеете в виду результат ID должен быть 3 и 6, а не 5? 5 имеет более короткую продолжительность обслуживания, чем 6 .. –

ответ

0

После выбора может быть быстрее.

(покрытие) Индексы

  • Cust_FkID, Overall_Rank
  • Cust_FkID, Service_Duration
  • Cust_FkID, Overall_Rank, Service_Duration
  • Overall_Rank
  • Service_Duration

Удалите индексы, которые не используются, глядя на план выполнения.

SQL Заявление

SELECT b.* 
FROM binventory_ostemp b 
     INNER JOIN (
      SELECT b.Cust_FkID 
        , ovr.Overall_Rank 
        , MAX(Service_Duration) AS Service_Duration 
      FROM binventory_ostemp b 
        INNER JOIN (
        SELECT Cust_FkID 
          , MIN(Overall_Rank) AS Overall_Rank 
        FROM binventory_ostemp   
        GROUP BY 
          Cust_FkID 
       ) ovr ON ovr.Cust_FkID = b.Cust_FKID 
          AND ovr.Overall_Rank = b.Overall_Rank   
      GROUP BY 
        b.Cust_FkID 
        , ovr.Overall_Rank 
     ) ovrs ON ovrs.Cust_FkID = b.Cust_FkID 
        AND ovrs.Overall_Rank = b.Overall_Rank 
        AND ovrs.Service_Duration = b.Service_Duration 
+0

Ошибка: # 1054 - Неизвестный столбец «ovr.Overall_Rank» в разделе «on» – sam

+0

@sam - aliassing by '=' заменен на 'AS'. Привязка с помощью '=' - это синтаксис SQL Server, а не MySQL. –

+0

просто понял, что Lieven – sam

Смежные вопросы