Хотите получить результат без использования подзапроса? - PullRequest
1 голос
/ 08 марта 2012
SELECT  
   ROW_NUMBER()over(partition by tblProductTemplateHdr.product_ID 
                    order by tblProductTemplateHdr.product_ID, tblProcessSequence.sl_No) AS rno,
   tblProductTemplateHdr.product_ID
   ,tblProductProcessHdr.process_ID
   ,tblProcessSequence.sl_No    
FROM 
   Production.tblProcessSequence 
INNER JOIN 
   Production.tblProductProcessHdr ON tblProductProcessHdr.product_Process_ID = tblProcessSequence.product_Process_ID AND tblProductProcessHdr.isQC_Need = 1  
INNER JOIN 
   Production.tblProductTemplateHdr ON tblProductTemplateHdr.product_Temp_ID = tblProductProcessHdr.product_Temp_ID 

Мне нужна строка с максимумом sl_No в каждом product_Id без использования подзапроса. В результате, полученном при выполнении этого запроса, необходимо применить фильтрацию к тому же запросу

image

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

Вам нужно: а) немного переписать ваш запрос, и б) я бы рекомендовал использовать псевдонимы таблиц , чтобы сделать ваш запрос более читабельным.

Попробуйте это:

;WITH ProductData AS
(
  SELECT  
     ROW_NUMBER() OVER (PARTITION BY pth.Product_ID 
                        ORDER BY pth.Product_ID, ps.sl_No DESC) AS rno,
     tph.product_ID,
     tph.process_ID,
     ps.sl_No    
  FROM 
     Production.tblProcessSequence ps
  INNER JOIN 
     Production.tblProductProcessHdr pph ON tph.product_Process_ID = ps.product_Process_ID 
                                         AND pph.isQC_Need = 1  
  INNER JOIN 
     Production.tblProductTemplateHdr tph ON tph.product_Temp_ID = pph.product_Temp_ID 
)
SELECT *
FROM 
    ProductData
WHERE
    rno = 1

Функция ROW_NUMBER() разбивает ваши данные на Product_ID и внутри каждого раздела упорядочивает строки по sl_No DESC - таким образом, наибольшее значение sl_No получает значение rno = 1 (все остальные получаютстаршие цифры в каждом разделе)

1 голос
/ 08 марта 2012

Вы можете использовать другую оконную функцию:

MAX(tblProcessSequence.sl_No) OVER(PARTITION BY tblProductTemplateHdr.product_ID)

ADDENDUM

Просто для того, чтобы дать полный запрос в контексте, если вышеприведенное неясно:

SELECT  ROW_NUMBER() OVER (PARTITION BY tempHdr.Product_ID  ORDER BY Seq.sl_No DESC) AS rno,
        tempHdr.product_ID,
        procHdr.process_ID,
        Seq.sl_No,
        MAX(Seq.sl_No) OVER(PARTITION BY tblProductTemplateHdr.Product_ID) AS Max_SL_No
FROM    Production.tblProcessSequence Seq
        INNER JOIN Production.tblProductProcessHdr procHdr
            ON Seq.product_Process_ID = tblProductProcessHdr.product_Process_ID 
            AND procHdr.isQC_Need = 1  
        INNER JOIN Production.tblProductTemplateHdr tempHdr
            ON tempHdr.product_Temp_ID = procHdr.product_Temp_ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...