选择中的序数

时间:2014-11-03 18:54:24

标签: sql oracle11g

首先抱歉我的英语不好,这不是我的母语:(

我是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。

3 个答案:

答案 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)

-- =============================================