小编Tim*_*ane的帖子

窗口函数或公用表表达式:计算范围内的前一行

我想使用窗口函数为每一行确定满足特定条件的先前记录的总数.

一个具体的例子:

clone=# \d test
              Table "pg_temp_2.test"
 Column |            Type             | Modifiers 
--------+-----------------------------+-----------
 id     | bigint                      | 
 date   | timestamp without time zone | 
Run Code Online (Sandbox Code Playgroud)

我想知道每个date'之前1小时'内的行数date.

我可以使用窗口功能吗?或者我需要调查CTE吗?

我真的希望能够写出像(不工作)的东西:

SELECT id, date, count(*) OVER (HAVING previous_rows.date >= (date - '1 hour'::interval))
FROM test;
Run Code Online (Sandbox Code Playgroud)

我可以通过加入测试来编写这个,如下所示 - 但这不会扩展到特别大的表.

SELECT a.id, a.date, count(b.*)-1 
FROM test a, test b 
WHERE (b.date >= a.date - '1 hour'::interval AND b.date < a.date)
GROUP BY 1,2
ORDER BY 2;
Run Code Online (Sandbox Code Playgroud)

这是我可以用递归查询做的事吗?还是定期的CTE?CTE不仅仅是我所知道的很多东西.我有一种感觉,我很快就会去.:)

sql postgresql plpgsql common-table-expression window-functions

4
推荐指数
1
解决办法
2584
查看次数

将 MMX/SSE 指令移植到 AltiVec

我在 ASM 方面的经验极其有限,在 SIMD 方面的经验就更少了。

但碰巧我有以下 MMX/SSE 优化代码,我想将其移植到 AltiVec 指令以在 PPC/Cell 处理器上使用。

这可能是一个很大的问题..尽管只有几行代码,但我在尝试弄清楚这里发生的事情时遇到了无穷无尽的麻烦。

原函数:

static inline int convolve(const short *a, const short *b, int n)
{
    int out = 0;
    union {
        __m64 m64;
        int i32[2];
    } tmp;
    tmp.i32[0] = 0;
    tmp.i32[1] = 0;
    while (n >= 4) {
        tmp.m64 = _mm_add_pi32(tmp.m64,
                               _mm_madd_pi16(*((__m64 *)a),
                                             *((__m64 *)b)));
        a += 4;
        b += 4;
        n -= 4;
    }
    out = tmp.i32[0] + tmp.i32[1];
    _mm_empty();

    while (n --)
        out += (*(a++)) * (*(b++)); …
Run Code Online (Sandbox Code Playgroud)

c simd altivec mmx

3
推荐指数
1
解决办法
1112
查看次数