【问题标题】:Bucketing value until it hits max buck sql分桶值直到它达到 max buck sql
【发布时间】:2016-11-21 19:49:53
【问题描述】:

我正在尝试根据 Max Hours 将一个事件存储到多个存储桶中。在我的示例中,此处的 Pin 的最大小时数为 1938。因此,它仅通过我的查询将其存储到 2000 范围内。 但理想情况下,当 pin 已达到 1938 小时时,它在过去的某个时间一定有 500、1000 和 1500 小时。因此,我正在寻找一个查询,该查询将不仅在

我的查询

SELECT *,
CASE WHEN "MAX HOURS" <= 500 THEN '500' 
 WHEN "MAX HOURS" <=1000  THEN '1000'
 WHEN "MAX HOURS" <=1500 THEN '1500'
 WHEN "MAX_HOURS" <=2000 THEN '2000'
 WHEN "MAX_HOURS" <=2500 THEN '2500'
 WHEN "MAX_HOURS" <=3000 THEN '3000' 
 WHEN "MAX_HOURS" <=3500 THEN '3500' 
 WHEN "MAX_HOURS" <=4000 THEN '4000' 
 WHEN "MAX_HOURS" <=4500 THEN '4500' 
 WHEN "MAX_HOURS" <=5000 THEN '5000'
ELSE 'OVER 5000'
END AS Hours_Bucket
FROM PA_BTC

[电流输出]

PIN   Max hours  Hours_Bucket
XYZ   1938.10       2000

以下是我所期望的:对于所有引脚群。我不确定是否以及如何创建一个循环来创建以下所需的输出。 [预期结果]

PIN  Max hours  Hours_Bucket
XYZ  1938            500
XYZ  1938           1000
XYZ  1938           1500
XYZ  1938           2000

【问题讨论】:

  • 查看您正在查询的表会有所帮助,但我认为您可能只需要添加GROUP BY pin
  • 等等...忽略我的第一条评论。我读错了
  • 英文版的可以吗?

标签: mysql netezza


【解决方案1】:

我讨厌这个查询的样子,但我不确定其他方法

SELECT PIN, `MAX HOURS`, 500 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 0
UNION ALL
SELECT PIN, `MAX HOURS`, 1000 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 500
UNION ALL
SELECT PIN, `MAX HOURS`, 1500 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 1000
UNION ALL
SELECT PIN, `MAX HOURS`, 2000 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 1500
UNION ALL
SELECT PIN, `MAX HOURS`, 2500 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 2000
UNION ALL
SELECT PIN, `MAX HOURS`, 3000 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 2500
UNION ALL
SELECT PIN, `MAX HOURS`, 3500 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 3000
UNION ALL
SELECT PIN, `MAX HOURS`, 4000 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 3500
UNION ALL
SELECT PIN, `MAX HOURS`, 4500 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 4000
UNION ALL
SELECT PIN, `MAX HOURS`, 5000 AS Hours_Bucket
FROM PA_BTC
WHERE `MAX HOURS` > 4500

【讨论】:

  • 非常感谢@CptMisery。它可以工作,只是它没有包含在最后一个最大 bin 中。我的意思是 1938 小时的 pin 被分成 500(0-500 ),1000(500-1000),1500(1000-1500) 与您的查询,但它错过了 2000(1500-2000) 存储桶,因为查询中的条件 > 2000。对于所有击中最大桶的引脚,该最大桶是否有任何解决方法
  • 我已经编辑了我的查询。它与第一个相同,但我将其扩展为包括您的所有存储桶
  • 非常感谢。现在似乎很容易,但以前没有打到我。非常感谢!!
  • 没问题。抱歉,查询很丑陋。真的不确定在 SQL 中执行此操作的另一种方法。您可以将此标记为答案吗?我需要更多这些甜蜜的业力点
【解决方案2】:

如果您可以使用小桌子(可以是临时的或常规的),这是一种可能性。

首先,创建一个表以将获得资格所需的最少小时数存储到存储桶中。在您的示例中,1938 将通过大于 0 进入 500,通过大于 500 进入 1000,等等。

要创建的表示例:

 create temp table bucket_max (
   max_hours_val int
 , max_hours character varying(10)
 );

 insert into bucket_max values (0,'500');
 insert into bucket_max values (500,'1000');
 insert into bucket_max values (1000,'1500');
 insert into bucket_max values (1500,'2000');
 insert into bucket_max values (2000,'2500');
 insert into bucket_max values (2500,'3000');
 insert into bucket_max values (3000,'3500');
 insert into bucket_max values (3500,'4000');
 insert into bucket_max values (4000,'4500');
 insert into bucket_max values (4500,'5000');
 insert into bucket_max values (5000,'Over 5000');

然后根据先前的桶数量使用 >= 进行连接,以强制对结果进行半笛卡尔运算。示例:

SELECT pb.pin, pb."MAX HOURS", bm.max_hours
FROM pa_btc pb
    left join
    bucket_max bm 
    on pb."MAX HOURS" >= bm.max_hours_val
;

这应该给出最大小时满足存储桶最小值的所有值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2015-05-10
    • 1970-01-01
    • 2019-11-03
    相关资源
    最近更新 更多