Sql 机具行编号()
如何在sql server中实现行数窗口函数而不使用该函数本身,可能是在索引表上使用join 或者更多,我如何实现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
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 . . . 您向相关子查询添加了附加筛选。如果要筛选结果,请将其放入外部查询中。