我正在使用PostgreSQL版本9.1并查看Postgres文档,我知道可以执行以下操作:
SELECT salary, sum(salary) OVER (ORDER BY salary) FROM empsalary;
Run Code Online (Sandbox Code Playgroud)
这适用于我的查询.
现在我需要能够在?中指定别名而不是列名OVER (ORDER BY ...)?
我试过这个:
编辑:我以前忘了添加rank()到此查询:
SELECT salary, <complex expression> as result, rank() OVER (ORDER BY result) FROM empsalary;
Run Code Online (Sandbox Code Playgroud)
我说错了 column "result" does not exist.
是否可以在此处指定别名而不是列名?我错过了一些特殊的语法吗?
编辑:
我正在使用Hibernate,一些本机SQL用于窗口功能.生成并执行的完整SQL如下:
select
rank() OVER (ORDER BY deltahdlcOverruns DESC) as rank,
this_.deviceNo as y1_,
(SELECT _dev_.hdlcOverruns FROM abstractperformancestatistic _abs_
INNER JOIN enddevicestatistic _dev_ ON _dev_.id = _abs_.id
INNER JOIN linkstatistic _link_ ON _link_.id = _dev_.linkStatistic_id
INNER …Run Code Online (Sandbox Code Playgroud) 有一个访问数据表:
uid (INT) | created_at (DATETIME)
Run Code Online (Sandbox Code Playgroud)
我想查找用户连续多少天访问过我们的应用.例如:
SELECT DISTINCT DATE(created_at) AS d FROM visits WHERE uid = 123
Run Code Online (Sandbox Code Playgroud)
将返回:
d
------------
2012-04-28
2012-04-29
2012-04-30
2012-05-03
2012-05-04
Run Code Online (Sandbox Code Playgroud)
有5个记录和两个间隔 - 3天(4月28日至30日)和2天(5月3日至4日).
我的问题是如何找到用户连续访问应用程序的最大天数(示例中为3天).试图在SQL文档中找到合适的函数,但没有成功.我错过了什么吗?
UPD: 谢谢你们的回答!实际上,我正在使用vertica分析数据库(http://vertica.com/),但这是一个非常罕见的解决方案,只有少数人有使用它的经验.虽然它支持SQL-99标准.
那么,大多数解决方案只需稍作修改即可.最后我创建了自己的查询版本:
-- returns starts of the vitit series
SELECT t1.d as s FROM testing t1
LEFT JOIN testing t2 ON DATE(t2.d) = DATE(TIMESTAMPADD('day', -1, t1.d))
WHERE t2.d is null GROUP BY t1.d
s
---------------------
2012-04-28 01:00:00
2012-05-03 01:00:00
-- returns end of the vitit series
SELECT t1.d as …Run Code Online (Sandbox Code Playgroud) (PostgreSQL 8.4) 表"trackingMessages"存储移动设备(tm_nl_mobileid)和固定设备(tm_nl_fixedId)之间的跟踪事件.
CREATE TABLE trackingMessages
(
tm_id SERIAL PRIMARY KEY, -- PK
tm_nl_mobileId INTEGER, -- FK to mobile
tm_nl_fixedId INTEGER, -- FK to fixed
tm_date INTEGER, -- Network time
tm_messageType INTEGER, -- 0=disconnect, 1=connect
CONSTRAINT tm_unique_row
UNIQUE (tm_nl_mobileId, tm_nl_fixedId, tm_date, tm_messageType)
);
Run Code Online (Sandbox Code Playgroud)
这里的问题是,相同的移动设备可能随后连接到相同的固定设备两次(或更多次).我不希望看到后续的那些,但是可以看到移动设备在以后固定连接到同一个固定设备,前提是它们之间存在连接到不同的固定设备.
我想我很亲密但并不完全.我一直在使用以下CTE(在Stack Overflow上找到)
WITH cte AS
(
SELECT tm_nl_fixedid, tm_date, Row_number() OVER (
partition BY tm_nl_fixedid
ORDER BY tm_date ASC
) RN
FROM trackingMessages
)
SELECT * FROM cte
WHERE tm_nl_mobileid = 150 AND tm_messagetype = 1 …Run Code Online (Sandbox Code Playgroud) 我正在查询一个应付帐款表,其中包含ap文档列表,其中每个文档都包含我感兴趣的(以及其他字段)运行聚合查询的文件:
vendor_id,金额和日期.
我想在这个表上构建查询到我将获得的位置,按年份排序,前10名供应商按总数(金额总和)排序.
有人会告诉我如何使用排名功能.
是否可以将用户定义的聚合(clr)与窗口函数(over)一起使用?
在文档中找不到答案:http://technet.microsoft.com/en-us/library/ms190678.aspx
请考虑下表:
foo | bar
-----+-----
3 | 1
8 | 1
2 | 1
8 | 5
6 | 5
5 | 5
4 | 5
5 | 7
4 | 7
Run Code Online (Sandbox Code Playgroud)
列foo包含任何内容.列几乎bar是有序的,并且共同值的行彼此跟随.表包含约170万行,每个不同值约15行.barbar
我觉得PARTITION BY很慢,我想知道我是否可以采取任何措施来改善其性能?
我试过CREATE INDEX bar_idx ON foobar(bar)但它对性能没有影响(IRL已经在表的另一列上有一个主键).我正在使用PostgreSQL 9.3.5.
以下是EXPLAIN ANALYZE有和没有的简单查询PARTITION BY :
> EXPLAIN ANALYZE SELECT count(foo) OVER (PARTITION BY bar) FROM foobar;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
WindowAgg (cost=262947.92..293133.35 rows=1724882 width=8) (actual time=2286.082..3504.372 …Run Code Online (Sandbox Code Playgroud) postgresql query-optimization database-performance window-functions
我有一个用例,我需要在PARTITION上使用ROW_NUMBER():类似于:
SELECT
Column1 , Column 2
ROW_NUMBER() OVER (
PARTITION BY ACCOUNT_NUM
ORDER BY FREQ, MAN, MODEL) as LEVEL
FROM
TEST_TABLE
Run Code Online (Sandbox Code Playgroud)
我需要在Impala中解决这个问题.不幸的是,Impala不支持子查询,也不支持ROW_NUMBER()OVER功能.谢谢您的帮助.
我写了这个并在Oracle中成功执行
COUNT (DISTINCT APEC.COURSE_CODE) OVER (
PARTITION BY s.REGISTRATION_NUMBER
,APEC.APE_ID
,COV.ACADEMIC_SESSION
) APE_COURSES_PER_ACADEMIC_YEAR
Run Code Online (Sandbox Code Playgroud)
我正在尝试在SQL Server中实现相同的结果(我们的源数据库使用Oracle,但我们的仓库使用SQL Server).
我知道SQL Server 2008中的窗口函数不支持distinct - 有人可以提出替代方案吗?
我有一个用户的历史表,我正在尝试查找用户持有特定用户名的日期范围.该表是一个由触发器填充的审计表,因此每次对用户进行更改时都会有条目,而不仅仅是用户名.我可以这样做以获取每一行的日期范围:
CREATE TABLE #LoginHistory
(
LoginHistoryID INT IDENTITY(1,1),
LoginID INT,
Username VARCHAR(32),
StartDate DATETIME
)
INSERT INTO #LoginHistory (LoginID, Username, StartDate) VALUES
(1, 't', '2016-01-01'),
(1, 't', '2016-01-02'),
(1, 't', '2016-01-04'),
(1, 'test', '2016-01-05'),
(2, 't', '2016-01-08'),
(2, 'tom', '2016-01-09'),
(1, 'test', '2016-01-15'),
(1, 't', '2016-02-01')
SELECT
LoginID,
Username,
StartDate,
EndDate = LEAD(StartDate) OVER (PARTITION BY LoginID ORDER BY StartDate ASC)
FROM #LoginHistory
WHERE LoginID = 1
ORDER BY StartDate ASC
DROP TABLE #LoginHistory
Run Code Online (Sandbox Code Playgroud)
输出:
LoginID Username StartDate EndDate
1 …Run Code Online (Sandbox Code Playgroud) 但是,当您在同一查询中同时使用窗口函数和group by子句时会发生什么?
group by?window-functions ×10
sql ×7
postgresql ×5
sql-server ×2
group-by ×1
impala ×1
sqlclr ×1
vertica ×1