Je dois effectuer une mise à jour globale sur une table KDB pour mettre à jour deux colonnes. Pour la colonne FirstName, je souhaite supprimer sa valeur pour les enregistrements qui ont une chaîne vide dans la colonne SecondName, et pour la colonne FullName, je souhaite remplacer un délimiteur codé par un espace pour toutes les lignes de la table.
Cela n'est pas nécessaire être fait dans une seule instruction de mise à jour si cela aide.
update FirstName:$[SecondName like ""; FirstName; ""], FullName[FullName; " "; " "] from table }
J'ai du mal avec la syntaxe - ce qui précède est ma meilleure tentative mais cela ne fonctionne pas.
4 Réponses :
Une façon d'y parvenir en une seule instruction de mise à jour:
q) update FirstName:?[SecondName like ""; SecondName;FirstName], FullName:ssr[;" "; " "]@'FullName from table
Blimey - c'était rapide :) J'ai rafraîchi la page il y a seulement 10 minutes et je ne l'ai pas actualisée à nouveau avant de publier ma propre solution - la vôtre est certainement plus belle que la mienne, merci!
Heureux que cela ait aidé.
Je recommanderais de le faire en deux étapes
//create table with mock data table: ([]FirstName: ("aaa";"ccc"); SecondName: ("bbb";""); FullName: ("aaa bbb";"ccc ")); //step1: set First to "" whenever SecondName is "" table: update FirstName: (count i)#enlist"" from table where SecondName like ""; //step2: replace spaces in FullName table: update FullName: ssr[;" ";" "] each FullName from table;
Hah - très similaire au mien - étonné du nombre de réponses que j'ai eu si rapidement - merci beaucoup :)
Pour votre mise à jour du prénom, vous avez besoin d'un? plutôt qu'un $ comme opérateur de contrôle d'exécution. Comme il le fait, l'exécution avec une liste plutôt qu'un atome. Pour le FullName, vous devrez utiliser ssr, qui trouve où la chaîne a "& nbsp" et le remplace par ""
Ce qui donnerait ce qui suit:
q)tab:([]FirstName:("aa";"cc");SecondName:("";"dd");FullName:("aa ";"cc dd")) q)update FirstName:?[SecondName like ""; count[FirstName]#enlist""; FirstName],FullName:ssr[; " ";" "]each FullName from tab FirstName SecondName FullName ----------------------------- "" "" "aa " "cc" "dd" "cc dd"
J'espère que ceci répond à votre question.
Cordialement, Ponceuse
Merci beaucoup Sander - il semble qu'il existe de nombreuses façons d'obtenir ce résultat. J'ai quelque chose qui fonctionne maintenant, donc je ne perdrai pas de temps à essayer toutes les solutions proposées, mais j'apprécie vraiment votre contribution :)
Compris, je pense:
table:update FirstName:(count i)#enlist "" from table where SecondName like ""; table:update FullName:{ ssr[x; " "; " "] } each FullName from table where FullName like "* *";
Si cela vous aide, pensez à des références à des noms de colonnes comme des vecteurs, pas à des scalaires ...