2016-07-22 4 views
0

ich ein Top-10-Filter wie dies tun will:Wie implementiert man einen Top-n-Filter in 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 

aber das funktioniert nicht, da order-by in subquery not avaliable in Monetdb?

Also, was soll ich tun, um diese Top-n-Filter zu implementieren?


Das vereinfachte SQL-Beispiel:

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 

Was ich hier tun möchte, ist A und SUM (SA) von "mock_table_1" abfragen, wo D in den Top-10-D-Mitglieder und die Top-10-D-Mitglieder bedeutet, dass die Mitglieder des Feldes D, die die smallist SUM (SD)

+0

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

+0

Ich kann dir eine hübsche geben einfache Antwort, aber zuerst - bitte verwenden Sie ein _minimal_ Beispiel, dh die einfachste Tabelle und Abfrage, die Sie sich vorstellen können, für die Sie eine "Top-N-Filter" -Abfrage formulieren können. – einpoklum

+0

@einpoklum Sorry, ich gebe diese Abfrage, weil ich dachte, es ist einfach genug, um Sinn zu machen, ich kann es vereinfachen, wenn Sie wollen. – luochen1990

Antwort

0

So erstellen Funktion, die dies tut, die ein unbelastet zurückgibt (von Sub-Abfrage Einschränkungen) Tabelle hat

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 
    ); 

dann Ihre ursprüngliche Abfrage ändern:

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; 

Dies kann höchstwahrscheinlich auch, wie oben durch die Schaffung einer Ansicht auf dieser Unterabfrage und Verbinden der den Blick in einer ähnlichen Art und Weise durchgeführt werden. FYI, um diese Ansicht zu erstellen, gehen Sie folgendermaßen vor:

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; 
Verwandte Themen