SQL:将特定列中元素的第一个(或随机)结果映射到另一个列中的某些条件,并将其映射到变量

时间:2016-10-04 02:59:24

标签: sql google-bigquery

问题如下:我想查询数据库,并返回按时间戳窗口分组的两个不同列中具有特定值的命中数。我目前正在使用以下查询成功完成此操作:

SELECT shortdate, 
sum(column1 like '%interestingthing1%') thing1count, 
sum(column1 like '%interestingthing2%') thing2count,


FROM (
select LEFT(string(DATE), 8) shortdate,column1
from [database]
where column3 like '%thingthatcolumn3shouldbe%'
)
group by shortdate

ORDER BY 1 DESC
LIMIT 1000

我还要做的是还返回一个变量,它是column2的一个随机元素,对应于一个满足该字符串3的东西的行,每个有趣的东西(n = 1,2,...)。

我有一些直觉认为这可以通过一些用户定义的函数(我在google bigquery中执行此操作,允许使用javascript函数),或者在上面的FROM(...)语句中完成一堆UNION来完成。但由于我离SQL专家不远,这个问题部分是为了尽早开始使用一些最佳/更好的实践。裸体意见欢迎。

提前致谢,

塞缪尔

1 个答案:

答案 0 :(得分:1)

也许类似于下面的查询。当// this overload works when expected_types has a specialization for this value of E template<MessageType E> void processMessageHelper(MessageType msgType, void * data, typename expected_type<E>::type*) { if (msgType == E) Receive<E>(*(expected_type<E>::type*)data); else processMessageHelper<(MessageType)((int)E + 1)>(msgType, data, nullptr); } template<MessageType E> void processMessageHelper(MessageType msgType, void * data, bool) { processMessageHelper<(MessageType)((int)E + 1)>(msgType, data, nullptr); } template<> void processMessageHelper<MessageType::_LAST>(MessageType msgType, void * data, bool) { std::cout << "Unexpected message type\n"; } void ProcessMessage(MessageType msgType, void * data) { processMessageHelper<MessageType::_FIRST>(msgType, data, nullptr); } 满足您的条件时,它将为column2选择“第一”值,但由于进入聚合函数的值的顺序不是确定性的 - 它与随机一样好。由于column1聚合函数会忽略FIRST,因此我们只需确保在不满足条件时将NULLs转换为column2

NULL