2013-05-29 5 views
3

Я нашел странную проблему в q, возможную ошибку, я полагаю. я определил простую функцию, которая возвращает число с плавающей точкой, учитывая дату в качестве входных данных:Разница в поведении функции при вызове автономного или внутри запроса в q

give_dummy:{[the_date] 
    /// give_dummy[2013.05.10] // <- if u wanna test 
    :$[ the_date > 2013.01.01 ; 0.001 ; 0.002] ; 
} 

Она работает без проблем, если называется автономным:

q)give_dummy[2013.05.10] 
0.001 

Тем не менее, если я пытаюсь вызвать его в запросе я получаю сообщение об ошибке:

q)select give_dummy[date] from tab where sym = sec, i >= first_i , i < 4000 
'type 

Если я упрощаю функцию только вернуть (тождественную функцию) даты ввода, он работает в запросе. Если я упрощаю функцию, чтобы просто вернуть float, не сравнивая даты, он работает в запросе. Проблема возникает, когда я использую дату ввода для ее сравнения в if-statement: $ [the_date> 2013.01.01; 0,001; 0,002]

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

give_dummy:{[the_price] 
    /// give_dummy[12] // <- if u wanna test 
    :$[ the_price > 20 ; 0.001 ; 0.002] ; 
} 
q) give_dummy[12] 
0.002 
q)select give_dummy[price] from tab where sym = sec, i >= first_i , i < 4000 
'type 

ли вы, есть какое-то представление о том, почему это происходит? Я пробовал все. Благодаря Marco

+0

добавить, что если я пытаюсь вставить тривиальную Условный оператор в запросе, идентификатор не работает: выберите ($ [1> 0; 1; 0]), дату , price, volume from tab, где sym = sec 'rank –

+0

Если я использую оператор? [;;] вместо $ [;;]. Это работает .. O_o –

ответ

4

Вам нужно либо:

select give_dummy each date from tab where ... 

Или:

give_dummy:{[the_date] :?[ the_date > 2013.01.01 ; 0.001 ; 0.002]; } 
select give_dummy[date] from tab where ... 

? вектор условной. Смотрите здесь для более подробной информации: http://code.kx.com/q4m3/10_Execution_Control/

+0

Спасибо! Я уже узнал, что с? оно работает. Итак, вывод состоит в том, что я должен рассматривать каждый столбец, выбранный в запросе, как вектор, когда я использую его в функции, а не как функцию, действующую на отдельные записи. Я буду иметь в виду –

+0

Нет нужно для ':' Вы могли бы просто иметь функцию 'give_dummy: {[the_date]? [the_date> 2013.01.01; 0.001; 0.002]}', если вы опускаете последний ';', который в противном случае подавляет вывод В качестве примечания стороны столбцы не должны рассматриваться как векторы, они являются векторами. Ясно, что при определении таблицы '([] c1:' a'b'c; c2: 1 2 3) 'c1 и c2 - оба простых вектора (один из символов и другой из ints). Интернализация этого сделает жизнь намного проще, а ваш код намного яснее. – JPC