sql92-dml_是时候摆脱SQL-92思维定势了

sql92-dml

您是否陷入90年代?

如果仅使用SQL-92语言参考,那么您将忽略许多出色的功能,例如:

一些测试数据

上一篇文章中,我将一些CSV Codahale指标导入了PostgreSQL中以进行进一步分析。

我们的时间序列数据包括总请求计数和数据记录时间戳:

计数 Ť
151 1398778568
169 1398778583
169 1398778598
169 1398778613
169 1398778628
169 1398778643
1587 1398778658
6473 1398778673
11985 1398778688

到达速度

我想计算到达速度,可以将其定义为:

λ=到达速度=Δcount/Δt

对于每个时间事件,我们需要减去当前和以前的计数以及时间戳记值。

窗口函数使我们能够聚合/引用上一行/下一行,而不必将SELECT子句限制为单个结果行:

SELECT
	t as "Current time stamp",
	prev_t as "Previous time stamp",
	current_count as "Current total request count",
	prev_count as "Previous total request count",
	ROUND(((current_count - prev_count)::numeric/(t - prev_t)::numeric), 3) as "Velocity [req/sec]"	
FROM (
	SELECT
		t,
		lag(t, 1) over () as prev_t,				
		count as current_count,
		lag(count, 1) over () as prev_count
	FROM
		connection_lease_millis
	WINDOW grouping AS (			
		ORDER BY t
		ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
	)
) raw_data

给我们到达速度:

当前时间戳 上一个时间戳 当前总请求数 先前的总请求数 速度[req / sec]
1398778568 151
1398778583 1398778568 169 151 1.200
1398778598 1398778583 169 169 0.000
1398778613 1398778598 169 169 0.000
1398778628 1398778613 169 169 0.000
1398778643 1398778628 169 169 0.000
1398778658 1398778643 1587 169 94.533
1398778673 1398778658 6473 1587 325.733
1398778688 1398778673 11985 6473 367.467

到达加速

但是,如果我们要计算到达加速度(例如,我们可以算出到达率如何波动),该怎么办?

arrival_acceleration =Δarrival_velocity/Δt

这是我们可以做到的:

SELECT
	t as "Current time stamp",
	prev_t as "Previous time stamp",
	velocity "Velocity [Req/sec]",
	ROUND((velocity - lag(velocity, 1) over ())::numeric/(t - prev_t)::numeric, 3) as "Acceleration [req/sec2]"		
FROM (
	SELECT
		t,
		prev_t,
		current_count,
		prev_count,
		ROUND(((current_count - prev_count)::numeric/(t - prev_t)::numeric), 3) as velocity	
	FROM (
		SELECT
			t,
			lag(t, 1) over () as prev_t,				
			count as current_count,
			lag(count, 1) over () as prev_count
		FROM
			connection_lease_millis
		WINDOW grouping AS (			
			ORDER BY t
			ROWS BETWEEN 1 PRECEDING AND CURRENT ROW
		)
	) raw_data	
) velocity_data

给我们:

当前时间戳 上一个时间戳 速度[要求/秒] 加速度[req / sec2]
1398778568
1398778583 1398778568 1.200
1398778598 1398778583 0.000 -0.080
1398778613 1398778598 0.000 0.000
1398778628 1398778613 0.000 0.000
1398778643 1398778628 0.000 0.000
1398778658 1398778643 94.533 6.302
1398778673 1398778658 325.733 15.413
1398778688 1398778673 367.467 2.782

让我们对到达率分布有一个很好的了解:

arrival_velocity_acceleration1

结论

SQL提供了比标准聚合函数更多的功能。 窗口功能使您可以将行分组,同时仍保留选择条件。

你们中仍有多少人仍在使用Java,C#或Python 1.0版本? 我们不应该像使用日常使用的任何其他编程语言一样,从最新SQL功能中受益吗?

如果您仍然持怀疑态度,这篇很棒的文章可能会打消您的疑问。

翻译自: https://www.javacodegeeks.com/2014/05/time-to-break-free-from-the-sql-92-mindset.html

sql92-dml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值