首先抱歉我的英语不好,这不是我的母语:(
我是Oracle的新手,我需要帮助以下。我有几个具有相同ID,几个值(可以相同)和不同创建日期的记录。 我想为具有相同值但日期不同的ID选择序号。
例如
ID | Value | Date | Number
A | Value1 | 01.11. | 1
A | Value1 | 02.11. | 2
A | Value2 | 03.11. | null
A | Value2 | 01.11. | null
B | Value1 | 01.11. | 1
B | Value1 | 03.11. | 2
B | Value2 | 01.11. | null
C | Value1 | 01.11. | 1
C | Value2 | 01.11. | null
因此,对于我有Value1的第一个coloumn中的每个ID,我想要增加,而对于其余的值,我不需要任何东西。
我希望我不会发布双重问题我试图查一查,但我找不到任何答案。
提前谢谢!
编辑:对于其他值,将接受一个而不是null。
答案 0 :(得分:1)
基本思路是row_number()
获取顺序值,rank()
对值进行排名。您只希望枚举第一组。 “第一个”对应rank()
,其值为1
。其余的得到NULL
:
select id, value, date,
(case when rank() over (partition by id order by value) = 1
then row_number() over (partition by id order by value)
end) as number
from table t;
编辑:
我意识到你实际上可能想要 time 的第一个值而不是其他一些排序。为此,请使用keep
代替rank()
:
select id, value, date,
(case when value = max(value) keep (dense_rank first order by value) over (partition by id)
then row_number() over (partition by id order by value)
end) as number
from table t;
答案 1 :(得分:0)
with my_table as (
select 'A' ID, 'Value1' value, '01.11.' dt, 1 num from dual union all
select 'A', 'Value1', '02.11.', 2 from dual union all
select 'A', 'Value2', '03.11.', null from dual union all
select 'A', 'Value2', '01.11.', null from dual union all
select 'B', 'Value1', '01.11.', 1 from dual union all
select 'B', 'Value1', '03.11.', 2 from dual union all
select 'B', 'Value2', '01.11.', null from dual union all
select 'C', 'Value1', '01.11.', 1 from dual union all
select 'C', 'Value2', '01.11.', null from dual)
select *
from (select t.*, count(distinct dt) over (partition by value, id) diff_cnt
from my_table t) tt
where tt.diff_cnt > 1;
结果:
ID VALUE DT NUM DIFF_CNT
-- ------ ------ ---------- ----------
A Value1 01.11. 1 2
A Value1 02.11. 2 2
B Value1 01.11. 1 2
B Value1 03.11. 2 2
A Value2 01.11. 2
A Value2 03.11. 2
答案 2 :(得分:-1)
在AdventureWorks2014中试试这个。不知道你是否正在寻找那种东西。
CREATE FUNCTION GetCol
(
@SchemaName varchar(255) = 'dbo'
,@TableName varchar(255)
,@ColumnNumber smallint = 0
)
RETURNS varchar(255)
AS
BEGIN
DECLARE @ColumnName varchar(255)
;WITH TableArray (TableName, ColumnName, ColumnOrder)
AS
(
SELECT OBJECT_NAME(t.object_id), c.name, c.colorder
FROM syscolumns c
JOIN sys.tables t
ON t.object_id = c.id
WHERE object_id(@TableName) = t.object_id
)
SELECT @ColumnName = ColumnName
FROM TableArray
WHERE ColumnNumber = @ColumnNumber
IF @ColumnName IS NULL
BEGIN
RETURN 0
END
ELSE IF @ColumnName IS NOT NULL
BEGIN
RETURN @ColumnName
END
END
GO
-- =============================================
-- How to use Example:
DECLARE @TableName varchar(255) = '[Person].[EmailAddress]'
DECLARE @MySQLCMD varchar(max) = 'SELECT '+[dbo].[GetCol](@TableName,3)+' FROM '+@TableName
--SELECT @MySQLCMD
EXEC(@MySQLCMD)
-- =============================================