使用SQL,我试图将表中的数据分组为3维,为此,我需要一种方法来修改基于某些分组标准输出的值。然后,我计划使用GROUP命令最终将行组合在一起。
通过示例更容易描述。
我跑
SELECT b as b_bin
, l as l_bin
, k_1AperMag1 as k1_bin
, count(*) as num
FROM gpssource
WHERE b between -1.1 and 1.1
and l between 9.9 and 11.6
and k_1AperMag1 between 0 and 25
GROUP BY b, l, k_1AperMag1
并获得一张表
b_bin | l_bin | k1_bin | num
-1.0115976238979311 | 0.968853586216488 | 13.680575 | 1
-1.0299234557450931 | 11.591887279330654 | 16.761375 | 1
-0.3757959886541285 | 11.446711966673629 | 16.372013 | 1
-0.7250531677528679 | 11.357881248039163 | 17.16921 | 1
...and about 100 million more rows
我基本上需要将每一行分成b_bin,l_bin和k1_bin组。例如,第1行需要进入b bin -1.1 - > -1.0,l bin 0.9 - > 1.0和k1 bin 13 - > 14.我在SQL中执行此操作的想法是将-1.0115976238979311更改为-1.05,0.968853586216488更改为0.95和13.680575更改为13.5然后使用GROUP by命令将它们实际分组到bin中并获取每个bin的计数。
我的最终结果是:
b_bin | l_bin | k1_bin | num
-1.05 | 0.95 | 13.5 | 23
-0.95 | 0.95 | 13.5 | 20
-0.95 | 0.85 | 13.5 | 25
-0.95 | 0.85 | 12.5 | 23
and more, for each bin in b, l and k1.
最后,我将它放入矩阵并为其创建一个图像,其中b和l是x和y坐标,k1是3d空间中的切片,这导致类似这样的东西(通过将数据合并到蟒蛇):
不幸的是,我不确定如何从实际值到bin的中心值进行更改。这甚至可以用SQL实现吗?我已经在python中使用了所有这些,但出于后勤原因,我需要使用SQL来存储数据。
所以我的基本问题是:如何修改SELECT打印出的值。我可以使用format()以多种方式对其进行格式化,但据我所知,它并不能让我选择自己的值来输出... SQL是否还有函数?我用谷歌搜索了一段时间,但在这件事上找不到多少......
任何指针都会非常感激!
答案 0 :(得分:2)
我已经编写了一些SQL来获取您想要的结果:http://www.sqlfiddle.com/#!2/1a54a/1
以下是代码。我不确定这会有多好,但你可以尝试一下:
SET @bbinSize = 0.1;
SET @lbinSize = 0.1;
SET @kbinSize = 1;
SELECT
bbin,
lbin,
kbin,
COUNT(*)
FROM
(
SELECT
a.b,
a.l,
a.k_1AperMag1,
((FLOOR(((1 / @bbinSize) * a.b)) * @bbinSize) + @bbinSize / 2) bbin,
((FLOOR(((1 / @lbinSize) * a.l)) * @lbinSize) + @lbinSize / 2) lbin,
((FLOOR(((1 / @kbinSize) * a.k_1AperMag1)) * @kbinSize) + @kbinSize / 2) kbin
FROM
MyTable a
) bins
GROUP BY
bbin,
lbin,
kbin
可能更好的想法是创建三个新表BBin
,LBin
和KBin
,每个表包含三列Name
,{{1} },MinValue
。然后将每个bin填充到这些bin中。
您的查询可能会变成:
MaxValue
我怀疑第二种选择会表现得更好,但我会留给你测试。