2016-07-22 1 views
0

Je veux faire un filtre top 10 comme ceci:Comment implémenter un filtre n haut dans Monetdb?

SELECT t0."A" AS d0, 
    t0."B" AS d1, 
    t0."C" AS d2, 
    t0."D" AS d3, 
    SUM(t0."SA") AS m0, 
    SUM(t0."SB") AS m1 
FROM "mock_table_1" AS t0 
INNER JOIN (     //the top 10 filter begin here 
    SELECT t0."D" AS fd, 
    SUM(t0."SD") AS top 
    FROM "mock_table_1" AS t0 
    GROUP BY t0."D" 
    ORDER BY top ASC 
    LIMIT 10 
) AS p0u1 
ON (t0."D" = p0u1.fd)   //the top 10 filter end here 
GROUP BY t0."A", 
    t0."B", 
    t0."C", 
    t0."D" 
HAVING (SUM(t0."X") <= 100000000) 
LIMIT 100 

mais cela ne fonctionne pas depuis order-by in subquery not avaliable in Monetdb?

Alors, que dois-je faire pour mettre en œuvre ce filtre haut n?


L'exemple SQL simplifié:

SELECT t0."A" AS d0, 
    SUM(t0."SA") AS m0 
FROM "mock_table_1" AS t0 
INNER JOIN (     //the top 10 filter begin here 
    SELECT t0."D" AS fd, 
    SUM(t0."SD") AS top_cond 
    FROM "mock_table_1" AS t0 
    GROUP BY t0."D" 
    ORDER BY top_cond ASC 
    LIMIT 10 
) AS top_filter 
ON (t0."D" = top_filter.fd)  //the top 10 filter end here 
GROUP BY t0."A" 
LIMIT 100 

Ce que je veux faire ici est d'interroger A et SUM (SA) de "mock_table_1" où D est dans le top-10-D-membres , et le haut-10-D-membres désigne les membres du domaine D qui a la SUM smallist (SD)

+0

Commencez ici? http://stackoverflow.com/questions/30641876/monetdb-sql-method-to-locate-or-match-by-the-nearest-value-without-a-top-or-lim –

+0

Je peux vous donner une jolie réponse simple, mais d'abord - veuillez utiliser un exemple _minimal_, c'est-à-dire la table et la requête les plus simples auxquelles vous pouvez penser et pour lesquelles vous pouvez formater une requête "top n filter". – einpoklum

+0

@einpoklum Désolé, je donne cette requête car je pensais que c'est assez simple pour faire le sens, je peux le simplifier si vous le souhaitez. – luochen1990

Répondre

0

créer ainsi la fonction qui fait cela qui renvoie un inutilisé (par des restrictions de sous-requêtes) tableau

CREATE FUNCTION my_cheating_function() 
    RETURNS TABLE (fd [data type for fd], top [data type for top]) 
    RETURN TABLE (
     SELECT 
      t0."D" AS fd, 
      SUM(t0."SD") AS top 
     FROM 
      "mock_table_1" AS t0 
     GROUP BY 
      t0."D" 
     ORDER BY 
      top ASC 
     LIMIT 10 
    ); 

ensuite modifier votre requête d'origine:

SELECT t0."A" AS d0, 
    t0."B" AS d1, 
    t0."C" AS d2, 
    t0."D" AS d3, 
    SUM(t0."SA") AS m0, 
    SUM(t0."SB") AS m1 
    FROM 
    "mock_table_1" AS t0 
    INNER JOIN 
    my_cheating_function() AS p0u1 
    ON 
    (t0."D" = p0u1.fd)   
    GROUP BY 
    t0."A", 
    t0."B", 
    t0."C", 
    t0."D" 
    HAVING (SUM(t0."X") <= 100000000) 
    LIMIT 100; 

Cela peut très probablement être fait aussi en créant une vue sur cette sous requête et se joindre à la vue de la même façon que ci-dessus. Pour créer cette vue, procédez comme suit:

CREATE VIEW my_cheating_view AS 
    SELECT 
     t0."D" AS fd, 
     SUM(t0."SD") AS top 
    FROM 
     "mock_table_1" AS t0 
    GROUP BY 
     t0."D" 
    ORDER BY 
     top ASC 
    LIMIT 10;