问题如下:我想查询数据库,并返回按时间戳窗口分组的两个不同列中具有特定值的命中数。我目前正在使用以下查询成功完成此操作:
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专家不远,这个问题部分是为了尽早开始使用一些最佳/更好的实践。裸体意见欢迎。
提前致谢,
塞缪尔
答案 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