SQL для создания Лучших 10 и Другого

Кто-то предложил использовать nc (netcat). Это решение действительно работает, но менее идеально, чем просто использование ssh-t. Самая большая проблема состоит в том, что Вы должны использовать nc с обеих сторон соединения и должны сделать некоторое исследование порта на локальной машине для нахождения надлежащего порта, по которому можно соединиться. Вот адаптация вышеупомянутого кода для использования netcat:

$pid = fork();
if(!$pid)
{
  exec("ssh $host -f 'tail -f $filename |nc $localhost $port'");
  exit;
}

exec("nc -l -p $port");
7
задан arooaroo 6 October 2009 в 08:58
поделиться

4 ответа

Я пробовал некоторые из других решений здесь, однако они кажутся либо немного неправильными, либо порядок не совсем правильный.

Моя попытка решения Microsoft SQL Server, похоже, работает правильно:

SELECT Ctry, Sales FROM
(
    SELECT TOP 2
        Ctry,
        SUM(Sales) AS Sales
    FROM
        Table1
    GROUP BY
        Ctry
    ORDER BY
        Sales DESC
) AS Q1
UNION ALL
SELECT
    'Other' AS Ctry,
    SUM(Sales) AS Sales
FROM
    Table1
WHERE
    Ctry NOT IN (SELECT TOP 2
            Ctry
              FROM 
                Table1
              GROUP BY
            Ctry
              ORDER BY
            SUM(Sales) DESC)

Обратите внимание, что в моем примере, Я использую только TOP 2, а не TOP 10. Это просто из-за того, что мои тестовые данные более ограничены. Вы можете легко заменить 2 на 10.

Вот сценарий SQL для создания таблицы:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Table1](
    [Ctry] [varchar](50) NOT NULL,
    [Sales] [float] NOT NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

И мои данные выглядят так:

GB  10
GB  21.2
GB  34
GB  16.75
US  10
US  11
US  56.43
FR  18.54
FR  98.58
WE  44.33
WE  11.54
WE  89.21
KR  10
PO  10
DE  10

Обратите внимание, что результат запроса правильно упорядочен отделом продаж совокупное значение, а не буквенный код страны, и что категория "Другое" всегда идет последней,

6
ответ дан 7 December 2019 в 07:47
поделиться
SELECT Ctry, sum(Sales) Sales
FROM (SELECT COALESCE(T2.Ctry, 'OTHER') Ctry, T1.Sales
        FROM (SELECT Ctry, sum(Sales) Sales
                FROM Table1
              GROUP BY Ctry) T1
            LEFT JOIN 
             (SELECT TOP 10 Ctry, sum(sales) Sales
                FROM Table1
              GROUP BY Ctry) T2 
            on T1.Ctry = T2.Ctry
     ) T
GROUP BY Ctry
1
ответ дан 7 December 2019 в 07:47
поделиться

В псевдо-SQL: выберите топ-10 заказов по продажам СОЮЗ выберите "Другое", СУММ (продажи), где нет (выберите 10 лучших, как указано выше)

0
ответ дан 7 December 2019 в 07:47
поделиться

Объедините первую десятку с помощью внешнего соединения первой десятки с таблицей, чтобы агрегировать остальные.

У меня нет доступа к SQL, но я рискну предположение:

select top (10) Ctry, sales from table1
union all 
select 'other', sum(sales)
from table1 
left outer join (select top (10) Ctry, sales from table1) as table2
on table2.Ctry = table2.Ctry 
where table2.ctry = null
group by table1.Ctry

Конечно, если это быстро изменяющаяся вершина (10), то вы либо блокируете, либо сохраняете копию вершины (10) на время запроса.

0
ответ дан 7 December 2019 в 07:47
поделиться
Другие вопросы по тегам:

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