我想使用窗口函数为每一行确定满足特定条件的先前记录的总数.
一个具体的例子:
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
我在 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)