Строки возврата SQL в “циклическом” порядке

Я протестировал приведенный ниже код и работал нормально

Также я использую библиотеку: org.apache.commons.lang.ArrayUtils

public void testConcatArrayString(){
    String[] a = null;
    String[] b = null;
    String[] c = null;
    a = new String[] {"1","2","3","4","5"};
    b = new String[] {"A","B","C","D","E"};

    c = (String[]) ArrayUtils.addAll(a, b);
    if(c!=null){
        for(int i=0; i<c.length; i++){
            System.out.println("c[" + (i+1) + "] = " + c[i]);
        }
    }
}

С уважением

8
задан hhaamu 29 July 2009 в 09:30
поделиться

5 ответов

См. Эту статью в моем блоге для более подробного объяснения того, как это работает:

С новым PostgreSQL 8.4 :

SELECT  *
FROM    (
        SELECT  site, url, ROW_NUMBER() OVER (PARTITION BY site ORDER BY url) AS rn
        FROM    urls
        )
ORDER BY
        rn, site

] В более старых версиях:

SELECT  site,
        (
        SELECT  url
        FROM    urls ui
        WHERE   ui.site = sites.site
        ORDER BY
                url
        OFFSET  total
        LIMIT   1
        ) AS url
FROM    ( 
        SELECT  site, generate_series(0, cnt - 1) AS total
        FROM    (
                SELECT  site, COUNT(*) AS cnt
                FROM    urls
                GROUP BY
                        site
                ) s
        ) sites
ORDER BY
        total, site

, хотя может быть менее эффективным.

4
ответ дан 5 December 2019 в 19:02
поделиться

Я думаю, вы слишком усложняете это. Почему бы просто не использовать

ORDER BY NewID ()

3
ответ дан 5 December 2019 в 19:02
поделиться

Вы запрашиваете циклический алгоритм, но я думаю, что простое

SELECT site, url FROM urls ORDER BY RANDOM()

поможет. Он должен работать, даже если URL-адреса с одного сайта сгруппированы в db.

2
ответ дан 5 December 2019 в 19:02
поделиться

Вы можете использовать функцию liftM * из модуля Control.Monad или функции liftA * для ] аппликативы .

liftM позволяет поднять чистую функцию для работы внутри монады, например:

ghci> let s = return "Hello" :: IO String
ghci> liftM reverse s
"olleH"

Таким образом, вам не нужно вручную писать такие вещи, как " s >> = \ x -> return (reverse x) "везде.

Хотя это не поможет вам с вашим примером [(String, Int, IO Int)] , если чистый у вас есть функция [(String, Int, Int)] . Поскольку третий элемент в кортеже на самом деле не является Int .

В этом случае я бы предложил сначала написать функцию [(String, Int, IO Int)] -> IO [(String, Int, Int)] и применяют повышенную чистую функцию.


Это самая общая функция, которую я мог придумать для этого:

conv :: Monad m => (f (m a) -> m (f a)) -> [f (m a)] -> m [f a]
conv f = sequence . map f

Вы можете назвать ее так:

liftTrd :: Monad m => (a, b, m c) -> m (a, b, c)
liftTrd (x, y, mz) = mz >>= \z -> return (x, y, z)

conv liftTrd [("hi", 4, return 2)] :: IO [(String, Int, Int)]

Эта функция будет работать только в том случае, если у вас есть единственная монада, которая находится где-то глубоко в типе. Если у вас их несколько, я думаю, вам действительно стоит подумать о типе, с которым вы работаете, и посмотреть, не сможете ли вы сделать это проще.

//www.example.com/some/other/file
  • ] https://stackoverflow.com/questions/ask
  • org /
  • Временная таблица:

    example.com       1
    stackoverflow.com 2
    perl.org          3
    

    Затем для каждого URL-адреса вы ищите значение в временной таблице и добавляете к нему 3 (потому что в ней 3 отдельные записи):

    Итерация 1:

    URL-адресов :

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   NULL
    https://stackoverflow.com/questions/ask   NULL
    https://stackoverflow.com/tags            NULL
    http://use.perl.org/                     NULL
    

    Временная таблица:

    example.com       4
    stackoverflow.com 2
    perl.org          3
    

    Итерация 2:

    URL-адреса:

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   4
    https://stackoverflow.com/questions/ask   NULL
    https://stackoverflow.com/tags            NULL
    http://use.perl.org/                     NULL
    

    Временная таблица:

    example.com       7
    stackoverflow.com 2
    perl.org          3
    

    и так далее, пока вы не дойдете до

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   4
    https://stackoverflow.com/questions/ask   2
    https://stackoverflow.com/tags            5
    http://use.perl.org/                     3
    

    Для большого количества записей это будет медленным. И будет сложно работать со многими вставками / удалениями, но результатом будет безупречное циклическое упорядочение.

    s имеет 3 отдельные записи):

    Итерация 1:

    URL-адреса:

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   NULL
    https://stackoverflow.com/questions/ask   NULL
    https://stackoverflow.com/tags            NULL
    http://use.perl.org/                     NULL
    

    Временная таблица:

    example.com       4
    stackoverflow.com 2
    perl.org          3
    

    Итерация 2:

    URL-адреса:

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   4
    https://stackoverflow.com/questions/ask   NULL
    https://stackoverflow.com/tags            NULL
    http://use.perl.org/                     NULL
    

    Временная таблица:

    example.com       7
    stackoverflow.com 2
    perl.org          3
    

    и так далее, пока вы не дойдете до

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   4
    https://stackoverflow.com/questions/ask   2
    https://stackoverflow.com/tags            5
    http://use.perl.org/                     3
    

    Для многих записей это будет медленным. И будет сложно работать со многими вставками / удалениями, но результатом будет безупречное циклическое упорядочение.

    s имеет 3 отдельные записи):

    Итерация 1:

    URL-адреса:

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   NULL
    https://stackoverflow.com/questions/ask   NULL
    https://stackoverflow.com/tags            NULL
    http://use.perl.org/                     NULL
    

    Временная таблица:

    example.com       4
    stackoverflow.com 2
    perl.org          3
    

    Итерация 2:

    URL-адреса:

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   4
    https://stackoverflow.com/questions/ask   NULL
    https://stackoverflow.com/tags            NULL
    http://use.perl.org/                     NULL
    

    Временная таблица:

    example.com       7
    stackoverflow.com 2
    perl.org          3
    

    и так далее, пока вы не дойдете до

    http://www.example.com/some/file         1
    http://www.example.com/some/other/file   4
    https://stackoverflow.com/questions/ask   2
    https://stackoverflow.com/tags            5
    http://use.perl.org/                     3
    

    Для многих записей это будет медленным. И будет сложно работать со многими вставками / удалениями, но результатом будет безупречное циклическое упорядочение.

    0
    ответ дан 5 December 2019 в 19:02
    поделиться

    Есть гораздо более простое и быстрое решение ...

    • добавить столбец sort_order типа TEXT
    • добавить триггер ON INSERT, который устанавливает sort_order в md5 (url)
    • index on sort_order
    • захватывает строки в порядке (sort_order, primary key)

    -> это очень быстро и индексируется -> строки будут иметь повторяющийся, но случайный порядок

    0
    ответ дан 5 December 2019 в 19:02
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: