根据函数更改值的格式

时间:2012-10-23 03:11:40

标签: sql

使用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空间中的切片,这导致类似这样的东西(通过将数据合并到蟒蛇): density map of the galaxy

不幸的是,我不确定如何从实际值到bin的中心值进行更改。这甚至可以用SQL实现吗?我已经在python中使用了所有这些,但出于后勤原因,我需要使用SQL来存储数据。

所以我的基本问题是:如何修改SELECT打印出的值。我可以使用format()以多种方式对其进行格式化,但据我所知,它并不能让我选择自己的值来输出... SQL是否还有函数?我用谷歌搜索了一段时间,但在这件事上找不到多少......

任何指针都会非常感激!

1 个答案:

答案 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

可能更好的想法是创建三个新表BBinLBinKBin,每个表包含三列Name,{{1} },MinValue。然后将每个bin填充到这些bin中。

您的查询可能会变成:

MaxValue

我怀疑第二种选择会表现得更好,但我会留给你测试。