在SAS中使用SQL,如何创建一个新列来计算/指示现有列中值的唯一性。。?

在SAS中使用SQL,如何创建一个新列来计算/指示现有列中值的唯一性。。?,sql,sas,counting,Sql,Sas,Counting,我的数据如下: ID 1 2 3 3 4 5 6 6 我想创建一列,指示ID列中某个值的唯一性,如下所示: ID COUNT 1 1 2 1 3 1 3 0 4 1 5 1 6 1 6 0 我不希望通过子查询或其他方式创建临时表。任何帮助都将不胜感激。一个选项是按数据步骤中的功能使用: data have; input ID; datalines; 1 2 3 3 4 5 6 6 ;run; data want; set have; by ID; if f

我的数据如下:

ID
1
2
3
3
4
5
6
6
我想创建一列,指示ID列中某个值的唯一性,如下所示:

ID  COUNT
1   1
2   1
3   1
3   0
4   1
5   1
6   1
6   0

我不希望通过子查询或其他方式创建临时表。任何帮助都将不胜感激。

一个选项是按数据步骤中的功能使用:

data have;
input ID;
datalines;
1
2
3
3
4
5
6
6
;run;

data want;
set have;
by ID;
if first.ID then count = 1;
else count = 0;
run;

一个选项是按数据步骤中的功能使用:

data have;
input ID;
datalines;
1
2
3
3
4
5
6
6
;run;

data want;
set have;
by ID;
if first.ID then count = 1;
else count = 0;
run;

这种类型的逻辑实际上不适合SQL,因为观察的顺序并没有真正得到保证。在更现代的SQL版本中,可以使用窗口函数(如带有分区依据的ROW_NUMBER())来强制记录计数

如果您真的想在PROC-SQL中实现这一点,您可能需要使用未记录的
MONOTONIC()
函数。但是,即使这样,为了阻止优化器消除重复行,您可能需要首先使用行计数器创建一个临时表

data have;
  input ID @@;
datalines;
1 2 3 3 4 5 6 6
;

proc sql ;
  create table _temp_ as select id,monotonic() as row from have;
  create table want as
    select a.id
         , b.row=min(b.row) as FLAG
    from have a,_temp_ b
    where a.id=b.id
    group by a.id
    order by 1,2
  ;
quit;

这种类型的逻辑实际上不适合SQL,因为观察的顺序并没有真正得到保证。在更现代的SQL版本中,可以使用窗口函数(如带有分区依据的ROW_NUMBER())来强制记录计数

如果您真的想在PROC-SQL中实现这一点,您可能需要使用未记录的
MONOTONIC()
函数。但是,即使这样,为了阻止优化器消除重复行,您可能需要首先使用行计数器创建一个临时表

data have;
  input ID @@;
datalines;
1 2 3 3 4 5 6 6
;

proc sql ;
  create table _temp_ as select id,monotonic() as row from have;
  create table want as
    select a.id
         , b.row=min(b.row) as FLAG
    from have a,_temp_ b
    where a.id=b.id
    group by a.id
    order by 1,2
  ;
quit;


到目前为止你试过什么?您是否被迫使用
proc-sql
(如在家庭作业问题中)?老实说,我甚至不确定从何处开始,但我对sql的偏好是因为我们将在不久的将来从SAS迁移到Oracle。您可以使用纯sql来获得该标志:
select-id,case-when-row\u number()结束时(按id划分顺序按id排序)=1然后1 else 0 end
您应该知道SAS SQL与Oracle SQL非常不同。你不能在它们之间复制粘贴。我不明白你想要的输出是如何衡量唯一性的。相反,您似乎在创建一个标记,该标记在每个组中只出现一次。请记住,SQL没有规定对单个记录进行排序。如果您在纯SQL中需要它,您将需要使用支持窗口功能的高级SQL实现?您是否被迫使用
proc-sql
(如在家庭作业问题中)?老实说,我甚至不确定从何处开始,但我对sql的偏好是因为我们将在不久的将来从SAS迁移到Oracle。您可以使用纯sql来获得该标志:
select-id,case-when-row\u number()结束时(按id划分顺序按id排序)=1然后1 else 0 end
您应该知道SAS SQL与Oracle SQL非常不同。你不能在它们之间复制粘贴。我不明白你想要的输出是如何衡量唯一性的。相反,您似乎在创建一个标记,该标记在每个组中只出现一次。请记住,SQL没有规定对单个记录进行排序。如果在纯SQL中需要,则需要使用支持窗口功能的高级SQL实现。感谢您的反馈,但我正在尝试从数据步骤中移开,因为我们将在不久的将来从SAS中移开。这在SQL中不容易。您是否有另一个表示“第一个”记录的变量,比如约会什么的?@Reeza不幸的是我没有……听起来我可能在这里运气不好?老实说,在我看来不值得这么努力。将其标记为过渡到Oracle时需要更新的部分。但是,即使使用分区,您也无法保证在数据步骤中可以保持一致的记录将被标记,因此无法从流程中获得相同的结果。我想如果这不重要的话,你可能会没事的。感谢反馈,但我正在尝试远离数据步骤,因为我们将在不久的将来远离SAS。这在SQL中并不容易。你是否有另一个变量可以指示“第一个”记录,比如约会什么的?@Reeza不幸的是我没有……听起来我可能在这里运气不好?老实说,在我看来不值得这么努力。将其标记为过渡到Oracle时需要更新的部分。但是,即使使用分区,您也无法保证在数据步骤中可以保持一致的记录将被标记,因此无法从流程中获得相同的结果。我想如果没关系的话,你很可能没事。