2016-07-22 3 views
0

Я хочу сделать топ-10 фильтр так:Как реализовать верхний n-фильтр в 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 

, но это не работает, так как order-by in subquery not avaliable in Monetdb?

Итак, что нужно сделать, чтобы реализовать этот верхний п фильтр?


Упрощенный SQL пример:

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 

То, что я хочу сделать здесь для запроса и SUM (SA) от "mock_table_1", где D находится в топ-10-D-членов , а верхние-10-D-членов означает членов поля D, который имеет smallist SUM (SD)

+0

начало здесь? http://stackoverflow.com/questions/30641876/monetdb-sql-method-to-locate-or-match-by-the-nearest-value-without-a-top-or-lim –

+0

Я могу дать вам довольно простой ответ, но сначала - пожалуйста, используйте пример _minimal_, т. е. простейшую таблицу и запрос, о которых вы можете думать, для которых вы можете сформировать запрос «top n filter». – einpoklum

+0

@einpoklum Извините, я даю этот запрос, потому что я думал, что это достаточно просто сделать, я могу упростить его, если вы хотите. – luochen1990

ответ

0

Так создать функцию, которая делает это, что возвращает неизрасходованный (за счет дополнительных ограничений запросов) таблица

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

Затем измените исходный запрос:

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; 

Это наиболее вероятно, также быть сделано путем создания представления о том подзапросе и присоединения к мнению аналогичным образом, как описано выше. FYI, чтобы создать этот вид, выполните следующие действия:

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; 
Смежные вопросы