es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encadenar declaraciones SQL, mientras que cada una pueda funcionar de forma independiente.

Usando Python (o cualquier pseudo código) estoy tratando de encontrar una forma utilizando CTE (o sin ella) para crear funciones en las que cada consulta tenga un objetivo específico, pero cada una también pueda servir como columna base para otra consulta.

No estoy seguro si hay un término para este tipo de algoritmo.

Por ejemplo, algunos usuarios quieren encontrar una caída del 5% en una columna ‘close’ de una curva, otros quieren encontrarlo sobre una columna ‘sma’ (media móvil simple) de esa misma curva, y otros solo quieren la media móvil simple.

// Esto puede encontrar la media móvil por sí sola, o puede devolver una consulta como base para otra

def obtenerConsultaSMA():
e = (”’
SELECT date, date_num, s, close,
avg(close) OVER (ORDER BY date_num
ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as sma
FROM history
”’)
return e //o ejecutar e

// Esto puede encontrar una caída en la curva en la columna sma como base, o en la tabla original

def encontrarCaída(sma):

e = (”’
WITH WIN AS (
SELECT date, date_num, s, close,
LAG(close,3) OVER (ORDER BY date_num) w0. //*** aquí LAG puede ser utilizado en la columna sma o en la columna close basado en el argumento sma
FROM {base}
WHERE s = ‘A’
), TRD AS(
SELECT date,date_num, s, close, 100*(close-w0)/close change
FROM WIN
WHERE w0 IS NOT NULL
), FRST AS(
SELECT date,date_num, s, close, change,
LAG(change,1) OVER (ORDER BY date_num) final_lag
FROM TRD
)
SELECT date,date_num, s, close, change, final_lag
FROM FRST
WHERE Abs(change) > 15 AND Abs(final_lag) < 15

''')

Entonces me gustaría encontrar una forma de concatenar la cadena de consulta de sma en esta consulta, de manera que pueda decidir si quiero ejecutar la segunda consulta donde LAG está en la columna ‘close’ o en el resultado de la columna ‘sma’.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para concatenar la cadena de consulta sma en la segunda consulta, puedes modificar la función findDrop para que acepte un argumento opcional sma. Si se proporciona el argumento, la cadena de consulta sma se concatenará en la expresión de tabla común WIN en lugar de utilizar la tabla original history. Aquí tienes una versión actualizada de la función findDrop:

    def findDrop(sma=None):
        base = "history" if sma is None else getquerySMA()
        lag_col = "close" if sma is None else "sma"
        e = f'''
            WITH WIN AS (
                SELECT date, date_num, s, close,
                LAG({lag_col}, 3) OVER (ORDER BY date_num) w0
                FROM {base}
                WHERE s = 'A'
            ), TRD AS (
                SELECT date, date_num, s, close, 100*(close-w0)/close change
                FROM WIN
                WHERE w0 IS NOT NULL
            ), FRST AS (
                SELECT date, date_num, s, close, change,
                LAG(change, 1) OVER (ORDER BY date_num) final_lag
                FROM TRD
            )
            SELECT date, date_num, s, close, change, final_lag
            FROM FRST
            WHERE Abs(change) > 15 AND Abs(final_lag) < 15
        '''
        return e
    

    Ahora puedes llamar a findDrop() sin argumentos para usar la tabla original history, o con sma=getquerySMA() para usar la consulta sma como la tabla base para la expresión de tabla común. Por ejemplo:

    # encontrar caída utilizando la tabla original history
    query1 = findDrop()
    print(query1)
    
    # encontrar caída utilizando la consulta sma como base
    sma_query = getquerySMA()
    query2 = findDrop(sma_query)
    print(query2)
    

Comments are closed.