sql sas hierarchical-data

Consulta jerárquica SAS SQL



hierarchical-data (2)

Entonces, como Gordon dice en los comentarios, no puedo pensar en una forma de hacer esto en PROC SQL.

Sin embargo, una forma "SAS" de hacer esto sería un análisis de componentes conectados. PROC OPTNET en SAS / OR hace justamente esto.

data have; input order_id base_order_id customer_id; datalines; 1 . 1 2 . 1 3 2 1 4 3 1 5 4 1 6 5 1 7 6 1 ; run; /*Connect the first order to itself*/ data have; set have; if base_order_id = . then base_order_id = order_id; run; /*Use SAS/OR and connected components*/ proc optnet data_links = have(rename=(order_id = to base_order_id = from)) out_nodes = out; concomp; run; /*Summarize and add customer id*/ proc sql noprint; create table want as select a.order_id, a.last_order_id, b.customer_id from ( select min(node) as order_id, max(node) as last_order_id from out group by concomp ) as a left join test as b on a.order_id = b.order_id; quit;

Esto devuelve lo que está buscando en el conjunto de datos WANT.

Estoy tratando de escribir una consulta sql (proc sql) para obtener datos de la tabla de ejemplo:

order_id base_order_id customer_id ========================================================== 1 null 1 //only one transaction ------------------------------------------------------------------------------- 2 null 1 //order_start 3 2 1 4 3 1 5 4 1 6 5 1 7 6 1 //order_end -------------------------------------------------------------------------------

como sigue:

order_id last_order_id customer_id 1 null 1 2 7 1

Déjame ponerlo de esta manera. Order_id 2 tiene 6 subprocesos. Podemos suponer que el pedido completo para ese Cliente consiste en order_id de 2 a 7. Order start = order_id 2 cuando el pedido completo finaliza en order_id 7.

Estoy empezando en sas sql. Intenté unirme a la misma mesa mediante la cláusula "tener" de left join, pero nada funcionó bien. ¿Hay alguna manera de obtener un resultado de la consulta como en la tabla 2?

Gracias de antemano.

EDIT2. SQL que escribí, que trae el resultado más cercano.

SELECT t1.order_id, t1.base_order_id as last_order_id, t1.customer_id FROM table1 t1 GROUP BY t1.order_id HAVING (t1.order_id = max(t1.base_order_id) or t1.base_order_id IS NULL)


La única forma en que soy consciente, requiere que agregue 2 nuevas columnas a los datos que está consultando. Una buena explicación de esto se puede encontrar aquí:

http://www.sitepoint.com/hierarchical-data-database-2/

No tengo tiempo ahora mismo para transcribir eso y ponerlo todo en una respuesta SO. Voy a modificar esta respuesta más adelante con un código que agregará las 2 nuevas columnas a su conjunto de datos de ejemplo. OMI, esta es la parte más difícil de todos modos.

Algunas cosas buenas sobre este enfoque:

  1. No es recursivo: permite que cualquier consulta SQL atraviese toda la jerarquía en una sola pasada.
  2. Es compatible con la indexación por lo que si tiene una gran cantidad de datos sus consultas se ejecutarán más rápido.
  3. Es bastante fácil de entender / consultar en contra. Las consultas simples pueden arrojar resultados potentes. Utilicé este enfoque en un complejo entorno de cadena de suministro para identificar los cuellos de botella futuros con una simple consulta SQL simple.