Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 机具行编号()_Sql_Sql Server_Sql Server 2008_Window Functions - Fatal编程技术网

Sql 机具行编号()

Sql 机具行编号(),sql,sql-server,sql-server-2008,window-functions,Sql,Sql Server,Sql Server 2008,Window Functions,如何在sql server中实现行数窗口函数而不使用该函数本身,可能是在索引表上使用join 或者更多,我如何实现 select ROW_NUMBER() OVER(PARTITION BY ATLAS_USER_ID ORDER BY Event_Time DESC) AS RR 不使用此函数时分区上的行数 分区是否类似于分组依据?您可以添加列,如 ID int IDENTITY(1,1) 试试这个。。只是一个尝试,不确定这是确切的你正在寻找。注意,这需要一个标识列 CREATE TABL

如何在sql server中实现行数窗口函数而不使用该函数本身,可能是在索引表上使用join

或者更多,我如何实现

select ROW_NUMBER() OVER(PARTITION BY ATLAS_USER_ID ORDER BY Event_Time DESC) AS RR
不使用此函数时分区上的行数


分区是否类似于分组依据?

您可以添加列,如

ID int IDENTITY(1,1)

试试这个。。只是一个尝试,不确定这是确切的你正在寻找。注意,这需要一个标识列

CREATE TABLE #TableName
    ([Id] int,[Dates] datetime)
;

INSERT INTO #TableName
    ([Id], [Dates])
VALUES

    (1, '2014-08-07 00:00:00'),
    (2, '2014-08-07 00:00:00'),
    (3,  '2014-08-07 00:00:00'),
    (4,  '2014-08-07 00:00:00'),
    (5, '2014-08-08 00:00:00'),
    (6,'2014-08-08 00:00:00'),
    (7, '2014-08-08 00:00:00'),
    (8,  '2014-08-09 00:00:00'),
    (9, '2014-08-09 00:00:00'),
    (10, '2014-08-09 00:00:00'),
    (11, '2014-08-10 00:00:00'),
    (12, '2014-08-10 00:00:00'),
    (13, '2014-08-10 00:00:00')


SELECT CASE
         WHEN [Id]%cn = 0 THEN cn
         ELSE [Id]%cn
       END,
       *
FROM   #TableName a
       JOIN (SELECT Count(1) cn,
                    [Dates]
             FROM   #TableName
             GROUP  BY [Dates]) b
         ON a.[Dates] = b.[Dates] 
更新:

要在where中添加case,只需在where子句中添加相同的case语句

SELECT CASE
         WHEN Id%cn = 0 THEN cn
         ELSE Id%cn
       END,
       *
FROM   atlas_events a
       JOIN (SELECT Count(1) AS cn,
                    Event_Time
             FROM   atlas_events
             GROUP  BY Event_Time) b
         ON a.Event_Time = b.Event_Time
WHERE  PRT_PROJECT_ID = 175
       AND ADV_PROJECT_ID = 713
       AND event_type = 1
       AND CASE
             WHEN [Id]%cn = 0 THEN cn
             ELSE [Id]%cn
           END = 5 

假设每行中都有一个唯一的标识符,则可以使用相关子查询或应用来获得相同的功能。如果事件时间不同:

select t.*,
       (select count(*)
        from table t2
        where t2.ATLAS_USER_ID = t.ATLAS_USER_ID and
              t2.Event_Time <= t.EventTime
       )
from table t;
如果它们不是不同的,但行中有另一个id:

select t.*,
       (select count(*)
        from table t2
        where t2.ATLAS_USER_ID = t.ATLAS_USER_ID and
              (t2.Event_Time < t.Event_Time or
               t2.Event_Time = t.Event_Time and t2.id <= t.id
              )
       )
from table t;

为什么你不能使用这个功能?我在一个建立数据库的项目中完成了这个任务。你知道吗?你到底想完成什么?为什么排数不够?是的,分区方式实际上与分组方式类似。如果您根本不需要任何分组,可以按事件\ U时间描述指定OVERORDER。很抱歉,将其与mysql-->ID int IDENTITY1,1混淆,但这将仅为每一行提供ID。带分区的行数为每个分区中的每一行提供id。这是“like”row num,没有分区。是的,你知道如何使用分区吗?我有一个想法,但它非常复杂。让我们看看你可能会带来好的结果answer@user2783069这是每组的计数。检查内部查询太棒了!我设法做到了这一点:当Id%cn=0时选择CASE,然后选择cn ELSE Id%cn END,*从atlas_事件中选择Count1作为cn,a.Event_Time=b.Event_Time,其中PRT_PROJECT_ID=175,ADV_PROJECT_ID=713,Event_type=1当值等于5时,我如何仅取事例列?@user2783069-哪一列=5?仅当为:case when[ID]%cn=0,则cn ELSE[Id]%cn END eqaul到5t2和t是同一个表?t2和t是不同的表别名。在这种情况下,他们会参考同一个表。您可以将表名放在表所在的位置。它返回整个表这是查询?看,这是原始查询。。。有什么想法吗?从ATLAS.ATLAS\u事件中选择按ATLAS\u用户\u ID顺序按事件\u时间描述的行数超额分配为RR、ATLAS\u用户\u ID、PRT\u活动\u类型、ADV\u活动\u ID、PRT\u活动\u ID,其中PRT\u项目\u ID=175和ADV\u项目\u ID=713,事件\u类型=1A,其中RR=5@user2783069 . . . 您向相关子查询添加了附加筛选。如果要筛选结果,请将其放入外部查询中。