行号Sybase SQL Anywhere在多个条件下更改
我有一个选择返回行号Sybase SQL Anywhere在多个条件下更改,sql,date,window-functions,row-number,sybase-asa,Sql,Date,Window Functions,Row Number,Sybase Asa,我有一个选择返回 EMP DOC DATE 1 78 01/01 1 96 02/01 1 96 02/01 1 105 07/01 2 4 04/01 2 7 04/01 3 45 07/01 3 45 07/01 3 67 09/01 我想添加一个行号(我会将其用作主id),但我希望它在“EMP”更改时始终更改,并且在文档与前一个相同时也不会更改,如: EMP DOC DATE ID 1 78 01/01 1 1
EMP DOC DATE
1 78 01/01
1 96 02/01
1 96 02/01
1 105 07/01
2 4 04/01
2 7 04/01
3 45 07/01
3 45 07/01
3 67 09/01
我想添加一个行号(我会将其用作主id),但我希望它在“EMP”更改时始终更改,并且在文档与前一个相同时也不会更改,如:
EMP DOC DATE ID
1 78 01/01 1
1 96 02/01 2
1 96 02/01 2
1 105 07/01 3
2 4 04/01 1
2 7 04/01 2
3 45 07/01 1
3 45 07/01 1
3 67 09/01 2
在SQL Server中,我可以使用LAG
来比较以前的文档,但我似乎找不到进入SYBASE SQL Anywhere的方法,我使用行数
来按“EMP”划分分区,但这不是我需要的
SELECT EMP, DOC, DATE, ROW_NUMBER() OVER (PARTITION BY EMP ORDER BY EMP, DOC, DATE) ID -- <== THIS WILL CHANGE THE ROW NUMBER ON SAME DOC ON SAME EMP, SO WOULD NOT WORK.
选择EMP,DOC,DATE,ROW_NUMBER()(按EMP顺序划分,按EMP,DOC,DATE)ID--您希望密集排列()
:
这将对组中具有相同emp
的行进行编号,并且仅当日期更改时才递增,没有间隔。如果性能不是您的问题,您可以尝试以下操作:
SELECT tx.EMP, tx.DOC, tx.DATE, y.ID
FROM table_xxx tx
join y on tx.EMP = y.EMP and tx.DOC = y.DOC
(SELECT EMP, DOC, ROW_NUMBER() OVER (PARTITION BY EMP ORDER BY DOC) ID
FROM(SELECT EMP, DOC FROM table_xxx GROUP BY EMP, DOC)x)y
快速简单,不知道为什么我没有尝试过(对行数是盲目的),但它工作得很好(我现在会更好地研究这个函数)。我使用了按单据和日期排序,因为我可以对多个单据使用相同的日期。太多了!
SELECT tx.EMP, tx.DOC, tx.DATE, y.ID
FROM table_xxx tx
join y on tx.EMP = y.EMP and tx.DOC = y.DOC
(SELECT EMP, DOC, ROW_NUMBER() OVER (PARTITION BY EMP ORDER BY DOC) ID
FROM(SELECT EMP, DOC FROM table_xxx GROUP BY EMP, DOC)x)y