标签: window-functions

在PostgreSQL中的查询中使用窗口函数中的别名

我正在使用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)

sql postgresql window-functions

6
推荐指数
2
解决办法
3317
查看次数

SQL问题 - 计算最大天数序列

有一个访问数据表:

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)

sql vertica window-functions

6
推荐指数
1
解决办法
3933
查看次数

过滤掉SELECT中的重复后续记录

(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)

sql postgresql window-functions gaps-and-islands

6
推荐指数
1
解决办法
1661
查看次数

使用postgres排名功能限制n个顶级结果

我正在查询一个应付帐款表,其中包含ap文档列表,其中每个文档都包含我感兴趣的(以及其他字段)运行聚合查询的文件:

vendor_id,金额和日期.

我想在这个表上构建查询到我将获得的位置,按年份排序,前10名供应商按总数(金额总和)排序.

有人会告诉我如何使用排名功能.

sql postgresql greatest-n-per-group window-functions

6
推荐指数
1
解决办法
5433
查看次数

6
推荐指数
1
解决办法
1819
查看次数

通过性能改善分区?

请考虑下表:

 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

6
推荐指数
1
解决办法
1723
查看次数

在impala中ROW_NUMBER()OVER

我有一个用例,我需要在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功能.谢谢您的帮助.

sql window-functions impala

6
推荐指数
2
解决办法
2万
查看次数

SQL Server 2008中的Count(Distinct([value))OVER(Partition by)

我写了这个并在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 - 有人可以提出替代方案吗?

sql sql-server-2008 window-functions

6
推荐指数
2
解决办法
3万
查看次数

对表进行分区以获取日期范围

我有一个用户的历史表,我正在尝试查找用户持有特定用户名的日期范围.该表是一个由触发器填充的审计表,因此每次对用户进行更改时都会有条目,而不仅仅是用户名.我可以这样做以获取每一行的日期范围:

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)

sql sql-server window-functions sql-server-2012

6
推荐指数
1
解决办法
1244
查看次数

窗口函数和group by子句如何交互?

我分别了解窗口功能分组.

但是,当您在同一查询中同时使用窗口函数和group by子句时会发生什么?

  • 所选行是否先分组,然后由窗口函数考虑?
  • 或者首先执行窗口函数,然后将结果值按group by
  • 别的什么?

postgresql group-by window-functions

6
推荐指数
1
解决办法
1228
查看次数