自动调整铲斗尺寸,以获取整个范围内的10个铲斗

时间:2019-05-06 20:29:55

标签: sql presto

以下查询可正常运行:

<provider android:authorities="com.myapp.crashlyticsinitprovider" android:exported="false" android:initOrder="90" android:name="com.crashlytics.android.CrashlyticsInitProvider"/>
<provider android:authorities="com.myapp.testapp.lifecycle-trojan" android:exported="false" android:multiprocess="true" android:name="android.arch.lifecycle.ProcessLifecycleOwnerInitializer"/>

但是,我尝试使存储桶大小自动调整到值的范围,以使整个范围内总共有10个存储桶:

const readline = require('readline')
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (line) => {
    var n = line.split(' ');
    for (var i = 0; i < n.length; i++) {
        var r = parseInt(n[i][0]);
        var e = parseInt(n[i][1]);
        var c = parseInt(n[i][2]);
        if (r > e - c) {
            console.log("do not advertise");
        }
        else if (r < e - c) {
            console.log("advertise");
        } else {
            console.log("does not matter");
        }
    }
}); 

此失败查询中的想法是使用最大值(假设最小值为0)以得出存储桶大小。有没有办法使它起作用,或者完全使用更好的方法?

1 个答案:

答案 0 :(得分:1)

您需要使用单独的子查询显式计算max(duration)。 将max(duration)替换为(SELECT max(duration) FROM flights)

作为副作用,flights表将被读取两次。 应该准确地阅读两次,而不是更多。您可以通过运行EXPLAIN <your query>并在输出中搜索Scan来进行验证。 如果flights使扫描仪两次以上,则可以进一步改善。 实际上,改进后的版本可能更易于阅读(我通过引用首选项还使用了简写GROUP BYORDER BY子句):

SELECT
  floor(duration / (max_duration/10)) * (max_duration/10) as bucket,
  count(*) as count
FROM flights, (SELECT max(duration) max_duration FROM flights)
GROUP BY 1
ORDER BY 1