Нужно получить n процентов строк в запросе u-sql

Нужна помощь в написании запроса u-sql, чтобы получить первые n процентов строк. У меня есть один набор данных, из которого нужно взять общее количество строк и взять верхние 3% строк из набора данных на основе col1. Код, который я написал:

 @count = SELECT Convert.ToInt32(COUNT(*)) AS cnt FROM @telData;
@count1=SELECT cnt/100 AS cnt1 FROM @count;
DECLARE @cnt int=SELECT Convert.ToInt32(cnt1*3)  FROM @count1;


        @EngineFailureData=
            SELECT vin,accelerator_pedal_position,enginefailure=1
            FROM @telData
            ORDER BY accelerator_pedal_position DESC
            FETCH @cnt ROWS;

@telData — мой основной набор данных. Спасибо за помощь.


person user3714403    schedule 06.06.2016    source источник


Ответы (1)


Сначала несколько комментариев:

  1. FETCH в настоящее время принимает в качестве аргументов только литералы (https://msdn.microsoft.com/en-us/library/azure/mt621321.aspx)
  2. @var = SELECT ... присвоит имя @var выражению набора строк, которое начинается с SELECT. U-SQL (в настоящее время) не предоставляет вам присвоение скалярной переменной с отслеживанием состояния из результатов запроса. Вместо этого вы должны использовать CROSS JOIN или другой JOIN для объединения скалярного значения.

Теперь к решению:

Чтобы получить процент, взгляните на функции ROW_NUMBER() и PERCENT_RANK(). Например, ниже показано, как использовать любой из них, чтобы ответить на ваш вопрос. Учитывая более простой код для PERCENT_RANK() (нет необходимости в MAX() и CROSS JOIN), я бы предложил это решение.

DECLARE @percentage double = 0.25; // 25%

@data = SELECT * 
        FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20) 
             ) AS T(pos);

@data =
SELECT PERCENT_RANK() OVER(ORDER BY pos) AS p_rank,
       ROW_NUMBER() OVER(ORDER BY pos) AS r_no,
       pos
FROM @data;

@cut_off =
SELECT ((double) MAX(r_no)) * (1.0 - @percentage) AS max_r
FROM @data;

@r1 =
SELECT *
FROM @data CROSS JOIN @cut_off
WHERE ((double) r_no) > max_r;

@r2 =
SELECT *
FROM @data
WHERE p_rank >= 1.0 - @percentage;

OUTPUT @r1
TO "/output/top_perc1.csv"
ORDER BY p_rank DESC
USING Outputters.Csv();

OUTPUT @r2
TO "/output/top_perc2.csv"
ORDER BY p_rank DESC
USING Outputters.Csv();
person Michael Rys    schedule 06.06.2016