Pregunta
· 5 mayo, 2023

SQL instruction : AVERAGE with LIMIT / only restricted rows

hola, me es imposible hacer una consulta de forma correcta. he probado con clausulas LIMIT, OVER ... no válidas para Intersystems por lo visto. Tambien probe con HAVING , con TOP, ... incluso con  GPT y otras AI, pero nada.

lo siento, pero mi sql no da para mas.

TABLA Comp.AlbLin

COLUMNAS AlbLin.ID , AlbLin.Description , AlbLin.Price , AlbLin.Date

Estoy peleando por una query que me calcule la MEDIA del campo precio AlbLin.Price pero solo de los ultimos/mas recientes 3 registros de fecha

---

i am not able to launch a right instruction in sql , please. LIMIT ... OVER ...no valid for Intersystems. i ve tried all . with HAVING, with TOP ,... paying for Ai and nothing.

my apologises , i am so limited.

TABLE Comp.AlbLin

COLUMNS AlbLin.ID , AlbLin.Description , AlbLin.Price , AlbLin.Date

i fight for a query to get the AVG average of AlbLin.Price for each AlbLin.ID taking only last/recent 3 rows AlbLin.Date

Comentarios (8)0
Inicie sesión o regístrese para continuar

¡Hola Albert! Te agradecería que, para beneficio de todos los usuarios de la comunidad de desarrolladores en español, planteases la pregunta traducida al español si es posible.

Con respecto a tu pregunta, prueba con la siguiente query:

SELECT 
a1.ID, AVG(a1.Price)
FROM Comp.AlbLin a1
WHERE a1."Date" in (SELECT TOP 3 a2."Date" FROM Comp.AlbLin a2 WHERE a1.ID = a2.ID ORDER BY a2."Date" DESC )
GROUP BY a1.ID order by a1.ID asc

Entiendo que el campo AlbLin.ID no es único por lo que indicas, por lo que podemos utilizar como criterio la fecha del dato. Te explico un poco la query:

  1. Puedes ver como tenemos dentro del WHERE una subquery que nos extraerá las últimas 3 fechas para cada AlbLin.ID, serán las 3 últimas ya que hemos indicado TOP 3 de una query ordenada por fecha de forma descendiente, así que siempre serán las 3 últimas fechas.
  2. En la SELECT principal hemos sacado el AlbLin.ID que nos servirá como criterio agrupador y hemos usado la función agrupadora AVG para AlbLin.Price.
  3. En la instrucción GROUP BY hemos definido el campo agrupador AlbLin.ID y hemos añadido un ORDER BY, este último no es necesario.

Pues bien, la subquery nos devolverá las 3 últimas fechas que usaremos en la query principal para sólo utilizar aquellos registros relativos al AlbLin.ID que coincidan con esas fechas (la subquery usa dentro de su WHERE el identificador de la query principal).

Prueba la query y coméntanos el resultado.

si, es correcta . y ademas bastante simple cuando las ves. lastima tener que molestar. muy agradecido por la aportacion. es relativamente sencilla , 😅

he intentado ir un poco mas alla , y mejorarla o mas bien complicarla. y he vuelto a ser incapaz de ubicar bien los case when para que funcione.

queria conseguir que si la fecha mas reciente tiene mas de quince dias " ... (a1.FechaLinea > DATE(CURRENT_DATE-15))  ..."  solo coja las 2 ultimas fechas . o sea que en lugar de un TOP 3 , sea un TOP 2.

he probado con los CASE WHEN dentro del select y fuera cambiando la instruccion pero no consigo que funcione.

de todas formas , la solucion ofrecida es para mi un gran aporte y cubre casi la totalidad de casos de la consulta. muchas gracias.

tambien funciona... 😁 . y yo dale que te pego con los CASE. ...

voy a ir desarrollar un poco mas la consulta , a ver si discurro algo mas y no hace falta vuestra atencion. ( seguro que vuelvo , jaja)

vaya ... un placer y muy agradecido de me hayais atendido las consultas tan rapido. ... y tan eficaces.

p.d.

dejo la sentencia completa como ejemplo por si  a alguien le sirve de modelo

v.0

SELECT a1.Articulo, a1.DescArticulo, AVG(a1.PrecioCoste)
FROM Comp.AlbaranLin a1
WHERE a1.FechaLinea in (SELECT TOP 3 a2.FechaLinea FROM Comp.AlbaranLin a2 WHERE a1.Articulo = a2.Articulo ORDER BY a2.FechaLinea DESC ) (*opcional *AND a1.Articulo = '337' AND a1.FechaLinea > DATE(CURRENT_DATE-15) *)
GROUP BY a1.Articulo order by a1.Articulo asc ;

v.1

SELECT a1.Articulo, a1.DescArticulo, AVG (a1.PrecioCoste)
FROM Comp.AlbaranLin a1
WHERE (a1.FechaLinea in (SELECT TOP 3 a2.FechaLinea FROM Comp.AlbaranLin a2 WHERE a1.Articulo = a2.Articulo ORDER BY a2.FechaLinea DESC ) AND a1.Articulo = '337' AND a1.FechaLinea >= DATE(CURRENT_DATE-15))
OR
(a1.FechaLinea in (SELECT TOP 2 a2.FechaLinea FROM Comp.AlbaranLin a2 WHERE a1.Articulo = a2.Articulo ORDER BY a2.FechaLinea DESC ) AND a1.Articulo = '337' AND a1.FechaLinea < DATE(CURRENT_DATE-15))
GROUP BY a1.Articulo order by a1.Articulo asc ;