2010-09-09 14 views
5

Estoy tratando de entender esto esta mañana.enigma SQL, cómo seleccionar la fecha más reciente para la pieza, pero solo 1 fila por cada parte (única)

Estoy tratando de mostrar el estado inventory para las piezas (para nuestros productos) y esta consulta solo se vuelve compleja si intento devolver todas las piezas.

Déjame ponerlo hacia fuera:

  • sola tabla inventoryReport
  • Tengo una lista distinta de las partes X Deseo mostrar, cuyo resultado debe ser X # de filas (1 fila por cada parte mostrando la última entrada de inventario).
  • tabla está formada por entradas fechadas de cambios en el inventario (por lo que solo necesito la entrada de fecha LATEST por pieza).
  • todos los datos contenidos en esta tabla única, por lo que no es necesaria ninguna unión.

la actualidad para 1 sola parte, es bastante simple y que puede lograr esto haciendo lo siguiente SQL (para darle una idea):

SELECT  TOP (1) ldDate, ptProdLine, inPart, inSite, inAbc, ptUm, inQtyOh + inQtyNonet AS in_qty_oh, inQtyAvail, inQtyNonet, ldCustConsignQty, inSuppConsignQty 
FROM   inventoryReport 
WHERE  (ldPart = 'ABC123') 
ORDER BY ldDate DESC 

que me pone mi fila superior 1, por lo simple por parte, sin embargo, necesito mostrar todas las X (digamos 30 partes). Entonces necesito 30 filas, con ese resultado. Por supuesto, la solución simple sería hacer un bucle X # de llamadas sql en mi código (pero sería costoso) y eso sería suficiente, pero para este propósito me gustaría trabajar este SQL un poco más para reducir las x # llamadas a la base de datos. (si no es necesario) hasta solo 1 consulta.

Por lo que puedo ver aquí, tengo que hacer un seguimiento de la última fecha por artículo de alguna manera mientras busco mi conjunto de resultados.

Me gustaría hacer una última instancia

WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc) 

para limitar las piezas que necesito. Espero haber aclarado mi pregunta lo suficiente. Avísame si tienes una idea. No puedo hacer un DISTINCT ya que las filas no son las mismas, la fecha debe ser la última y necesito un máximo de X filas.

¿Pensamientos? Estoy atascado ...

Respuesta

2

EDITAR: Asegúrese de probar el rendimiento de cada solución. Como se señaló en this question, el método CTE puede superar el rendimiento utilizando ROW_NUMBER.

;with cteMaxDate as (
    select ldPart, max(ldDate) as MaxDate 
     from inventoryReport 
     group by ldPart 
) 
SELECT md.MaxDate, ir.ptProdLine, ir.inPart, ir.inSite, ir.inAbc, ir.ptUm, ir.inQtyOh + ir.inQtyNonet AS in_qty_oh, ir.inQtyAvail, ir.inQtyNonet, ir.ldCustConsignQty, ir.inSuppConsignQty 
    FROM cteMaxDate md 
     INNER JOIN inventoryReport ir 
      on md.ldPart = ir.ldPart 
       and md.MaxDate = ir.ldDate 
5
SELECT * 
    FROM (SELECT i.*, 
     ROW_NUMBER() OVER(PARTITION BY ldPart ORDER BY ldDate DESC) r 
     FROM inventoryReport i 
     WHERE ldPart in ('ABC123', 'BFD21', 'AA123', etc) 
     ) 
    WHERE r = 1 
2

Es necesario unirse en una consulta Sub-:

SELECT i.ldPart, x.LastDate, i.inAbc 
FROM inventoryReport i 
INNER JOIN (Select ldPart, Max(ldDate) As LastDate FROM inventoryReport GROUP BY ldPart) x 
on i.ldPart = x.ldPart and i.ldDate = x.LastDate 
Cuestiones relacionadas