Кто-то предложил использовать 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");
Я пробовал некоторые из других решений здесь, однако они кажутся либо немного неправильными, либо порядок не совсем правильный.
Моя попытка решения 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
Обратите внимание, что результат запроса правильно упорядочен отделом продаж совокупное значение, а не буквенный код страны, и что категория "Другое" всегда идет последней,
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
В псевдо-SQL: выберите топ-10 заказов по продажам СОЮЗ выберите "Другое", СУММ (продажи), где нет (выберите 10 лучших, как указано выше)
Объедините первую десятку с помощью внешнего соединения первой десятки с таблицей, чтобы агрегировать остальные.
У меня нет доступа к 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) на время запроса.