{"id":2128,"date":"2020-07-22T02:13:58","date_gmt":"2020-07-22T02:13:58","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=2128"},"modified":"2020-07-22T02:17:19","modified_gmt":"2020-07-22T02:17:19","slug":"funciones-first_value-last_value-lag-y-lead","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=2128","title":{"rendered":"Funciones First_Value, Last_Value, Lag y Lead"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"260\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead__D.png\" alt=\"\" class=\"wp-image-2129\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Funciones First_Value, Last_Value, Lag y Lead<\/h2>\n\n\n\n<p>En este art\u00edculo se va a explicar el uso de las funciones First_Value, Last_Value, Lag y Lead, estas funciones permiten mostrar un conjunto de resultados para analizarlos de acuerdo a como se van presentando.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p style=\"font-size:24px\"><strong>Funci\u00f3n First_Value<\/strong><\/p>\n\n\n\n<p>Devuelve el primer valor en un conjunto ordenado de valores, la funci\u00f3n First_Value est\u00e1 disponible desde SQL Server 2012.<br><strong>Sintaxis:<br><\/strong>First_Value ( [Expresi\u00f3nNum\u00e9rica ] )<br>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden [ RangoFilas ] )<\/p>\n\n\n\n<p><strong>Donde<br>[Expresi\u00f3nNum\u00e9rica]<br><\/strong>Es el valor a devolver, puede ser una columna, una subconsulta u otra<br>expresi\u00f3n que d\u00e9 como resultado un solo valor.<br>Otras funciones anal\u00edticas no est\u00e1n permitidas.<br><strong>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden [ RangoFilas ] )<\/strong><br>Divide el conjunto de resultados producido por la cl\u00e1usula FROM en particiones a las que se aplica la funci\u00f3n. Si no se especifica, la funci\u00f3n trata todas las filas del conjunto de resultados de la consulta como un solo grupo.<br>Expresi\u00f3nOrden determina el orden l\u00f3gico en el que se realiza la operaci\u00f3n. Esta expresi\u00f3n es obligatoria<br>RangoFilas limita a\u00fan m\u00e1s las filas dentro de la partici\u00f3n especificando los puntos de inicio y final.<\/p>\n\n\n\n<p style=\"font-size:24px\"><strong>Funci\u00f3n Last_Value<\/strong><\/p>\n\n\n\n<p>Devuelve el \u00faltimo valor en un conjunto ordenado de valores, la funci\u00f3n Last_Value est\u00e1 disponible desde SQL Server 2012.<br><strong>Sintaxis:<\/strong><br>Last_Value ( [Expresi\u00f3nNum\u00e9rica ] )<br>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden [ RangoFilas ] )<\/p>\n\n\n\n<p><strong>Donde<br>[Expresi\u00f3nNum\u00e9rica]<br><\/strong>Es el valor a devolver, puede ser una columna, una subconsulta u otra<br>expresi\u00f3n que d\u00e9 como resultado un solo valor.<br>Otras funciones anal\u00edticas no est\u00e1n permitidas.<br><strong>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden [ RangoFilas ] )<\/strong><br>Divide el conjunto de resultados producido por la cl\u00e1usula FROM en particiones a las que se aplica la funci\u00f3n. Si no se especifica, la funci\u00f3n trata todas las filas del conjunto de resultados de la consulta como un solo grupo.<br>Expresi\u00f3nOrden determina el orden l\u00f3gico en el que se realiza la operaci\u00f3n. Esta expresi\u00f3n es obligatoria<br>RangoFilas limita a\u00fan m\u00e1s las filas dentro de la partici\u00f3n especificando los puntos de inicio y final.<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejemplos<\/strong><\/p>\n\n\n\n<p><strong>Usando Northwind<\/strong><br>use Northwind<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 1<\/strong><\/p>\n\n\n\n<p><strong>Listar los productos que son menos costoso y m\u00e1s costoso en una determinada categor\u00eda, para este ejemplo se muestran los productos de la categoria 3.<\/strong><br>select P.ProductName As &#8216;Producto&#8217;, P.UnitPrice As &#8216;Precio&#8217;,<br>FIRST_VALUE(P.ProductName) over (Order by P.UnitPrice Asc) As &#8216;M\u00e1s Barato&#8217;,<br>Last_VALUE(P.ProductName) over (Order by P.UnitPrice Asc) As &#8216;M\u00e1s Caro&#8217;<br>from Products As P<br>where P.CategoryID = 3<br>Order by P.UnitPrice asc<br>go<\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><strong>Explicaci\u00f3n<\/strong>:<br>Para el primer producto, \u00abTeatime Chocolate Biscuits\u00bb, cuyo precio es 9.20, este, al ser el primer producto es el m\u00e1s barato y a la vez en m\u00e1s caro. Al mostrarse el segundo producto \u00abZaanse koeken\u00bb, cuyo precio es de 9.50, en la columna m\u00e1s barato aparece \u00abTeatime Chocolate Biscuits\u00bb cuyo precio es de 9.20, y el m\u00e1s caro aparece el mismo producto \u00abZaanse koeken\u00bb como el mas caro. Como han sido ordenados por el precio en orden ascendente, el primer producto \u00abTeatime Chocolate Biscuits\u00bb aparece siempre como el m\u00e1s barato, luego el producto m\u00e1s caro va cambiando de acuerdo a como se muestran el resto de productos, hasta llegar al producto \u00abSir Rodney&#8217;s Marmalade\u00bb cuyo precio es 81.00 que es el m\u00e1s caro de la categor\u00eda.<br><strong>La imagen muestra el resultado.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_01.png\" alt=\"\" class=\"wp-image-2130\" width=\"871\" height=\"445\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_01.png 938w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_01-300x154.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_01-768x393.png 768w\" sizes=\"auto, (max-width: 871px) 100vw, 871px\" \/><\/figure>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 2<\/strong><\/p>\n\n\n\n<p><strong>Mostrar el m\u00e1s caro y el m\u00e1s barato de toda la categor\u00eda, usando la cl\u00e1usula Rows. <\/strong><br>select P.ProductName As &#8216;Producto&#8217;, P.UnitPrice As &#8216;Precio&#8217;,<br>FIRST_VALUE(P.ProductName) over (Order by P.UnitPrice Asc) As &#8216;M\u00e1s Barato&#8217;,<br>Last_VALUE(P.ProductName) over (Order by P.UnitPrice Asc<br>rows between unbounded preceding and Unbounded following) As &#8216;M\u00e1s Caro&#8217;<br>from Products As P<br>where P.CategoryID = 3<br>Order by P.UnitPrice asc<br>go<\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><strong>Explicaci\u00f3n:<\/strong><br>Compare el listado con la imagen anterior, en esta, usando la opci\u00f3n Rows se muestra para cada uno de los art\u00edculos el m\u00e1s barato de todos \u00abTeatime Chocolate Biscuits\u00bb que tiene un precio de 9.20 y el m\u00e1s caro de todos \u00abSir Rodney&#8217;s Marmalade\u00bb con un precio de 81.00.<br><strong>La imagen muestra el resultado.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_02.png\" alt=\"\" class=\"wp-image-2131\" width=\"798\" height=\"416\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_02.png 882w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_02-300x156.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_02-768x401.png 768w\" sizes=\"auto, (max-width: 798px) 100vw, 798px\" \/><\/figure>\n\n\n\n<p><strong>Podemos incluir los productos de otra categor\u00eda y mostrar el c\u00f3digo de la categor\u00eda para ver el resultado.<\/strong><br>select P.ProductName As &#8216;Producto&#8217;, P.UnitPrice As &#8216;Precio&#8217;, P.CategoryID As &#8216;C\u00f3d. Categor\u00eda&#8217;,<br>FIRST_VALUE(P.ProductName) over (Order by P.UnitPrice Asc) As &#8216;M\u00e1s Barato&#8217;,<br>Last_VALUE(P.ProductName) over (Order by P.UnitPrice Asc<br>rows between unbounded preceding and Unbounded following) As &#8216;M\u00e1s Caro&#8217;<br>from Products As P<br>where P.CategoryID = 3 or P.CategoryID = 4<br>Order by P.CategoryID, P.UnitPrice asc<br>go<\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><strong>Explicaci\u00f3n:<\/strong><br>En este ejecicio, usando tambi\u00e9n la opci\u00f3n Rows, se muestra<br>para cada uno de los art\u00edculos el m\u00e1s barato de todos \u00abGeitost\u00bb que tiene un precio de 2.50 y el m\u00e1s caro de todos \u00abSir Rodney&#8217;s Marmalade\u00bb con un precio de 81.00.<br><strong>La imagen muestra el resultado.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_03.png\" alt=\"\" class=\"wp-image-2132\" width=\"773\" height=\"641\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_03.png 908w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_03-300x249.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_03-768x638.png 768w\" sizes=\"auto, (max-width: 773px) 100vw, 773px\" \/><\/figure>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicio 3<\/strong><\/p>\n\n\n\n<p><strong>Particionando por categor\u00eda los que tienen menor y mayor unidades en Stock de las categorias 6 y 7<\/strong><\/p>\n\n\n\n<p>select<br>P.ProductName As &#8216;Producto&#8217;, P.UnitPrice As &#8216;Precio&#8217;,<br>P.UnitsInStock As &#8216;Stock&#8217;, P.CategoryID As &#8216;C\u00f3d. Categor\u00eda&#8217;,<br>FIRST_VALUE(P.ProductName)<br>over (Partition by P.CategoryID Order by P.UnitsInStock Asc) As &#8216;Menor Stock&#8217;,<br>Last_VALUE(P.ProductName)<br>over (Partition by P.CategoryID Order by P.UnitsInStock Asc) As &#8216;Mayor Stock&#8217;<br>from Products As P<br>where P.CategoryID in (6,7)<br>Order by P.CategoryID , P.UnitsInStock asc<br>go<\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><strong>Explicaci\u00f3n:<\/strong><br>Note que el art\u00edculo con menor stock es \u00ab<strong>Alice Mutton<\/strong>\u00bb con un valor de CERO para la categor\u00eda 6 y el de mayor stock es \u00ab<strong>P\u00e2t\u00e9 chinois<\/strong>\u00bb con un valor de 115. Luego aparecen los art\u00edculos de la categor\u00eda 7, el de menor stock con 4 unidades es \u00ab<strong>Longlife Tofu<\/strong>\u00bb y el de mayor stock con 35 unidades es \u00ab<strong>Tofu<\/strong>\u00ab.<br><strong>La imagen muestra el resultado.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_04-1024x398.png\" alt=\"\" class=\"wp-image-2133\" width=\"833\" height=\"323\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_04-1024x398.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_04-300x116.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_04-768x298.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_04.png 1061w\" sizes=\"auto, (max-width: 833px) 100vw, 833px\" \/><\/figure>\n\n\n\n<p style=\"font-size:24px\"><strong>Funci\u00f3n Lag<\/strong><\/p>\n\n\n\n<p>Accede a los datos de una fila anterior en el mismo conjunto de resultados<br>sin el uso de una uni\u00f3n autom\u00e1tica. LAG proporciona acceso a una fila en un desplazamiento f\u00edsico dado que viene antes de la fila actual.<br>Utilice esta funci\u00f3n anal\u00edtica en una instrucci\u00f3n SELECT para comparar valores en la fila actual con valores en una fila anterior.<br><strong>Sintaxis:<\/strong><br>Lag ( Expresi\u00f3nNum\u00e9rica [,offset] [,default] )<br>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden )<\/p>\n\n\n\n<p><strong>Donde<br>[Expresi\u00f3nNum\u00e9rica]<\/strong><br>Es el valor a devolver, puede ser una columna, una subconsulta u otra<br>expresi\u00f3n que d\u00e9 como resultado un solo valor.<br>Otras funciones anal\u00edticas no est\u00e1n permitidas.<br><strong>OffSet<\/strong><br>El n\u00famero de filas desde la fila actual desde la que se obtiene un valor.<br>Si no se especifica, el valor predeterminado es 1. el desplazamiento puede<br>ser una columna, subconsulta u otra expresi\u00f3n que se eval\u00fae como un entero positivo o se pueda convertir impl\u00edcitamente a bigint. offset no puede ser un valor negativo o una funci\u00f3n anal\u00edtica.<br><strong>Default<\/strong><br>El valor a devolver cuando el desplazamiento est\u00e1 fuera del alcance de la<br>partici\u00f3n. Si no se especifica un valor predeterminado, se devuelve NULL.<br>el valor predeterminado puede ser una columna, una subconsulta u otra expresi\u00f3n, pero no puede ser una funci\u00f3n anal\u00edtica. el valor predeterminado debe ser compatible con el tipo con scalar_expression.<br><strong>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden)<br><\/strong>Divide el conjunto de resultados producido por la cl\u00e1usula FROM en particiones a las que se aplica la funci\u00f3n. Si no se especifica, la funci\u00f3n trata todas las filas del conjunto de resultados de la consulta como un solo grupo.<br><strong>Expresi\u00f3nOrden<\/strong> determina el orden l\u00f3gico en el que se realiza la operaci\u00f3n. Esta expresi\u00f3n es obligatoria<\/p>\n\n\n\n<p style=\"font-size:24px\"><strong>Funci\u00f3n Lead<\/strong><\/p>\n\n\n\n<p>Accede a datos de una fila posterior en el mismo conjunto de resultados<br>sin el uso de una uni\u00f3n autom\u00e1tica que comienza con SQL Server 2012 (11.x).<br>LEAD proporciona acceso a una fila en un desplazamiento f\u00edsico dado que sigue a la fila actual.<br>Use esta funci\u00f3n anal\u00edtica en una instrucci\u00f3n SELECT para comparar valores en la fila actual con valores en la siguiente fila.<br><strong>Sintaxis:<br><\/strong>Lead ( Expresi\u00f3nNum\u00e9rica [,offset] [,default] )<br>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden )<\/p>\n\n\n\n<p><strong>Donde<br>[Expresi\u00f3nNum\u00e9rica]<br><\/strong>Es el valor a devolver, puede ser una columna, una subconsulta u otra<br>expresi\u00f3n que d\u00e9 como resultado un solo valor.<br>Otras funciones anal\u00edticas no est\u00e1n permitidas.<br><strong>OffSet<\/strong><br>El n\u00famero de filas desde la fila actual desde la que se obtiene un valor.<br>Si no se especifica, el valor predeterminado es 1. el desplazamiento puede<br>ser una columna, subconsulta u otra expresi\u00f3n que se eval\u00fae como un entero positivo o se pueda convertir impl\u00edcitamente a bigint. offset no puede ser un valor negativo o una funci\u00f3n anal\u00edtica.<br><strong>Default<\/strong><br>El valor a devolver cuando el desplazamiento est\u00e1 fuera del alcance de la<br>partici\u00f3n. Si no se especifica un valor predeterminado, se devuelve NULL.<br>el valor predeterminado puede ser una columna, una subconsulta u otra expresi\u00f3n, pero no puede ser una funci\u00f3n anal\u00edtica. el valor predeterminado debe ser compatible con el tipo con scalar_expression.<br><strong>OVER ( [Expresi\u00f3nPartici\u00f3n] Expresi\u00f3nOrden)<\/strong><br>Divide el conjunto de resultados producido por la cl\u00e1usula FROM en particiones a las que se aplica la funci\u00f3n. Si no se especifica, la funci\u00f3n trata todas las filas del conjunto de resultados de la consulta como un solo grupo.<br><strong>Expresi\u00f3nOrden <\/strong>determina el orden l\u00f3gico en el que se realiza la operaci\u00f3n. Esta expresi\u00f3n es obligatoria<\/p>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejemplos<\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 4<\/strong><\/p>\n\n\n\n<p>Este ejemplo utiliza una variable tipo tabla (<a href=\"https:\/\/manualsqlserver.com\/?p=522\" target=\"_blank\" rel=\"noreferrer noopener\">Ver variables tipo tabla<\/a>)<br>Se insertan datos de Ordenes en fechas determinadas, c\u00f3digo del producto y cantidad vendida en la orden. (<a href=\"https:\/\/manualsqlserver.com\/?p=294\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Insertar registros<\/a>)<br>Luego se muestran los datos mostrando la fecha m\u00e1s antigua y la m\u00e1s actual ordenados de acuerdo a la cantidad de producto vendido,<br>as\u00ed como los fechas l\u00edmites teniendo en cuenta ordenamiento seg\u00fan fecha.<\/p>\n\n\n\n<p>set dateformat dmy<br>Declare @Ordenes As table<br>(OrdenesFecha date, ProductoCodigo int,<br>ProductoDescripcion nvarchar(40), Cantidad Numeric(9,2))<br>INSERT INTO @Ordenes VALUES<br>(&#8217;23\/07\/2013&#8242;, 142, &#8216;Impresora&#8217;, 74),<br>(&#8217;06\/08\/2013&#8242;, 123, &#8216;Teclado&#8217;, 95),<br>(&#8217;15\/08\/2013&#8242;, 101, &#8216;Mouse&#8217;, 38),<br>(&#8217;11\/09\/2013&#8242;, 130, &#8216;Monitor&#8217;, 12),<br>(&#8217;30\/07\/2013&#8242;, 142, &#8216;Impresora&#8217;, 29),<br>(&#8217;18\/06\/2013&#8242;, 142, &#8216;Impresora&#8217;, 100),<br>(&#8217;10\/02\/2013&#8242;, 142, &#8216;Impresora&#8217;, 40),<br>(&#8217;16\/11\/2013&#8242;, 101, &#8216;Mouse&#8217;, 28),<br>(&#8217;21\/11\/2013&#8242;, 123, &#8216;Teclado&#8217;, 57),<br>(&#8217;23\/11\/2013&#8242;, 101, &#8216;Mouse&#8217;, 12)<br>&#8211;Listado de las \u00f3rdenes<br>SELECT<br>Format(OrdenesFecha,&#8217;dd\/MM\/yyy&#8217;) As &#8216;Fecha&#8217;,<br>ProductoCodigo As &#8216;C\u00f3digo&#8217;, ProductoDescripcion As &#8216;Producto&#8217;, Cantidad,<br>&#8216;Fecha menor venta&#8217; = Format(FIRST_VALUE(OrdenesFecha)<br>OVER(Partition BY ProductoCodigo Order by Cantidad),&#8217;dd\/MM\/yyy&#8217;),<br>&#8216;Fecha mayor venta&#8217; = Format(LAST_VALUE(OrdenesFecha)<br>OVER(Partition BY ProductoCodigo ORDER BY Cantidad<br>Rows Between UnBounded Preceding And UnBounded Following),&#8217;dd\/MM\/yyy&#8217;),<br>Previo = Format(LAG(OrdenesFecha, 1, OrdenesFecha)<br>OVER(Partition BY ProductoCodigo ORDER BY Cantidad ),&#8217;dd\/MM\/yyy&#8217;),<br>Siguiente = Format(LEAD(OrdenesFecha, 1, OrdenesFecha )<br>OVER(Partition BY ProductoCodigo ORDER BY Cantidad),&#8217;dd\/MM\/yyy&#8217;)<br>FROM @Ordenes<br>ORDER BY C\u00f3digo, Cantidad<br>go<\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><strong>Explicaci\u00f3n:<\/strong><br>Para explicar el conjunto de resultados se analizar\u00e1 los datos de cada producto. Para el primer producto que aparece que es \u00abMouse\u00bb, tiene registradas tres fechas de ventas: 23\/11\/2013, 16\/11\/2013 y 15\/08\/2013<br>ordenadas de acuerdo a la cantidad vendida en orden descedente 12.00, 28.00 y 38.00 respectivamente.<br>Usando las funciones First_Value y Last_Value se muestran las fechas en que se realiz\u00f3 la menor venta de 12 unidades (23\/11\/2013) y la de mayor venta de 38 unidades (15\/08\/2013).<br>Las funciones LAG y LEAD muestran el valor Previo (LAG) y el Siguiente (LEAD) respecto de las fechas de compra ordenados NO POR FECHA sino por la cantidad vendida, para la primera l\u00ednea, con una venta de 12 unidades, no existe valor previo y se muestra la misma fecha (23\/11\/2013), la fecha siguiente en que se vendi\u00f3 mas unidades es 16\/11\/2013 con una cantidad de 28.00 unidades. La segunda l\u00ednea de los resultados muestra la fecha de la venta previa (23\/11\/2013) y la recha de la siguiente venta 15\/08\/2013. La tercera l\u00ednea, siempre con las venta de Mouse muestra la fecha previa que se vendi\u00f3 28.00 unidades y la siguiente muestra la misma fecha de compra 15\/08\/2013 como la siguiente porque el siguiente producto ya no es Mouse, sino Teclado. <br>Para el caso del producto Monitor note que las fechas todas son iguales porque hay un solo registro..<br><strong>La imagen muestra el resultado.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_05-1024x368.png\" alt=\"\" class=\"wp-image-2134\" width=\"1005\" height=\"361\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_05-1024x368.png 1024w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_05-300x108.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_05-768x276.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_05.png 1042w\" sizes=\"auto, (max-width: 1005px) 100vw, 1005px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 5<\/strong><\/p>\n\n\n\n<p><strong>Usando la base de datos AdventureWorks<\/strong><br>Use AdventureWorks<br>go<\/p>\n\n\n\n<p>El siguiente ejemplo utiliza la funci\u00f3n LEAD para comparar las ventas anuales entre empleados.<br>La cl\u00e1usula PARTITION BY se especifica para dividir las filas en el conjunto de resultados por territorio de ventas.<br>La funci\u00f3n LEAD se aplica a cada partici\u00f3n por separado y la computaci\u00f3n se reinicia para cada partici\u00f3n.<br>La cl\u00e1usula ORDER BY especificada en la cl\u00e1usula OVER ordena las filas en cada partici\u00f3n antes de que se aplique la funci\u00f3n. La cl\u00e1usula ORDER BY en la instrucci\u00f3n SELECT ordena las filas en todo el conjunto de resultados. Tenga en cuenta que debido a que no hay un valor inicial disponible para la \u00faltima fila de cada partici\u00f3n, se devuelve el valor predeterminado de cero (0).<\/p>\n\n\n\n<p>Primero se va a mostrar los empleados y sus ventas anuales en cada uno de las regiones.<br>select S.BusinessEntityID As &#8216;C\u00f3digo&#8217;,<br>Empleado = CONCAT_WS(&#8216; &#8216;, S.FirstName, S.LastName),<br>TerritoryName As &#8216;Territorio&#8217;,<br>SalesYTD As &#8216;Ventas Anuales&#8217;<br>from Sales.vSalesPerson As S<br>WHERE TerritoryName = &#8216;<strong>Northwest<\/strong>&#8216;<br>go<br>La imagen muestra el resultado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_06.png\" alt=\"\" class=\"wp-image-2135\" width=\"807\" height=\"226\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_06.png 642w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_06-300x84.png 300w\" sizes=\"auto, (max-width: 807px) 100vw, 807px\" \/><\/figure>\n\n\n\n<p>select S.BusinessEntityID As &#8216;C\u00f3digo&#8217;,<br>Empleado = CONCAT_WS(&#8216; &#8216;, S.FirstName, S.LastName),<br>TerritoryName As &#8216;Territorio&#8217;,<br>SalesYTD As &#8216;Ventas Anuales&#8217;<br>from Sales.vSalesPerson As S<br>WHERE TerritoryName = &#8216;Southwest&#8217;<br>go<br>La imagen muestra el resultado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_07.png\" alt=\"\" class=\"wp-image-2136\" width=\"805\" height=\"228\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_07.png 558w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_07-300x85.png 300w\" sizes=\"auto, (max-width: 805px) 100vw, 805px\" \/><\/figure>\n\n\n\n<p>Ahora la comparaci\u00f3n de las ventas por empleado<br>SELECT S.BusinessEntityID As &#8216;C\u00f3digo&#8217;,<br>Empleado = CONCAT_WS(&#8216; &#8216;,S.FirstName, S.LastName),<br>TerritoryName As &#8216;Territorio&#8217;,<br>SalesYTD As &#8216;Ventas Anuales&#8217;,<br>LEAD (SalesYTD, 1, 0)<br>OVER (PARTITION BY TerritoryName ORDER BY SalesYTD DESC)<br>AS &#8216;Ventas siguiente Empleado&#8217;<br>FROM Sales.vSalesPerson As S<br>WHERE TerritoryName IN (&#8216;Northwest&#8217;, &#8216;Southwest&#8217;)<br>ORDER BY TerritoryName<br>go<\/p>\n\n\n\n<p class=\"has-background has-very-light-gray-background-color\"><strong>Explicaci\u00f3n:<\/strong><br>Al mostrar los empleados y las ventas por territorio se puede ver que existen tres empleados<br>del territorio Northwest, el empleado \u00abTete Mensa-Annan\u00bb tiene ventas anuales por el monto de 1576562,1966,<br>se puede ver que el empleado \u00abDavid Campbell\u00bb, que es el siguiente empleado tiene una ventas anuales de<br>1573012,9383, que es el valor que aparece en la columna \u00abVentas siguiente Empleado\u00bb.<br>Para el empleado David Campbell, las ventas que aparecen en la columna \u00abVentas siguiente Empleado\u00bb pertenecen<br>a la empleada \u00abPamela Ansman-Wolfe\u00bb. Para el empleado \u00abPamela Ansman-Wolfe\u00bb las ventas del siguiente empleado<br>aparecen en CERO porque el siguiente empleado pertenece a otro territorio que es \u00abSouthwest\u00bb.<br><strong>La imagen muestra el resultado.<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_08.png\" alt=\"\" class=\"wp-image-2137\" width=\"957\" height=\"235\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_08.png 928w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_08-300x74.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/07\/ManualSQL_FuncionesValue_Lag_Lead_08-768x189.png 768w\" sizes=\"auto, (max-width: 957px) 100vw, 957px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Funciones First_Value, Last_Value, Lag y Lead En este art\u00edculo se va a explicar el uso de las funciones First_Value, Last_Value, Lag y Lead, estas funciones permiten mostrar un conjunto de resultados para analizarlos de acuerdo a como se van presentando.<\/p><p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=2128\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2129,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[237,239,238,240],"class_list":["post-2128","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-funcionessql","tag-first_value","tag-lag","tag-last_value","tag-lead","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2128"}],"version-history":[{"count":3,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2128\/revisions"}],"predecessor-version":[{"id":2142,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2128\/revisions\/2142"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/2129"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2128"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2128"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}