Sql TOP子句的参数中不允许引用列“USER\u COUNT”
在一个问题上我需要一些帮助 我有一张这样的桌子:Sql TOP子句的参数中不允许引用列“USER\u COUNT”,sql,sql-server,Sql,Sql Server,在一个问题上我需要一些帮助 我有一张这样的桌子: CREATE TABLE [dbo].[USER_ACTIONS] ( [ID] [int] IDENTITY(1,1) NOT NULL, [USER_ID] [int] NOT NULL, [ACTION_ID] [int] NOT NULL, [DEVICE_ID] [tinyint] NOT NULL [DATE] [datetime] NOT NULL, PRIMARY KEY CLUS
CREATE TABLE [dbo].[USER_ACTIONS]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[USER_ID] [int] NOT NULL,
[ACTION_ID] [int] NOT NULL,
[DEVICE_ID] [tinyint] NOT NULL
[DATE] [datetime] NOT NULL,
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我想按用户ID、操作ID和设备ID保留10个最新记录和组
以下是我尝试过的:
IF OBJECT_ID('tempdb..#TempUsers') IS NOT NULL
DROP TABLE #TempUsers
SELECT USER_ID, COUNT(USER_ID) as USER_COUNT
INTO #TempUsers
FROM USER_ACTIONS
GROUP BY USER_ID, ACTION_ID,DEVICE_ID
HAVING COUNT(USER_ID) > 10
ORDER BY USER_COUNT
DELETE FROM USER_ACTIONS Actions
WHERE ID IN (SELECT TOP (USER_COUNT - 10) ID
FROM #TempUsers TMP
WHERE Actions.USER_ID = TMP.USER_ID
ORDER BY DATE ASC)
不幸的是,它不起作用,我收到以下消息:
TOP子句的参数中不允许引用列USER_COUNT。此处只允许引用外部作用域中的列或独立表达式和子查询
我希望避免性能循环
如果有人有主意,我将非常感激
非常感谢 您可以使用ROW_NUMBER并删除大于10的行,以删除最旧的行,并为每个组合保留最新的10行
DELETE t
FROM ( SELECT *,
RowNumber = ROW_NUMBER()
OVER(PARTITION BY USER_ID, ACTION_ID,DEVICE_ID
ORDER BY DATE DESC)
FROM USER_ACTIONS
) AS t
WHERE t.RowNumber > 10;
那么:
SELECT
*
, ROW_NUMBER() OVER (PARTITION BY a.USER_ID,a.ACTION_ID,a.DEVICE_ID ORDER BY a.DATE DESC) rn
INTO #tmp
FROM USER_ACTIONS a
SELECT
t.USER_ID,
t.ACTION_ID,
t.DEVICE_ID
t.DATE
FROM #tmp t
WHERE t.rn <= 10
你能按日期排序并选择前10名吗?你确定这是正确的代码吗?我在这个查询中找不到top子句?谢谢你的帮助,但我不想要10个最新的,而是针对特定用户、操作和设备的10个最新的。例如:如果我连接了20次,我想保持10次最新。如果其他用户连接了7次,我什么也不做。。。是的,这是正确的代码,下面是top子句:从用户\u操作中删除操作,其中ID在选择top USER\u计数中-10 ID从TempUsers TMP WHERE ACTIONS.USER\u ID=TMP.USER\u ID按日期ASC Ah排序,重新阅读您的评论。看起来您的代码仍然比需要的更难。您是否可以提供一个快速的示例表和输出以使其更清晰?这很奇怪,但是当我在用户ID上添加一个索引以尝试提高性能时,执行时间是没有索引的两倍。仅供参考,我只有20个动作Id和8个设备Id我错过了什么吗?感谢LOT当您有一个索引时,您必须同时从聚集索引和非聚集索引中删除。因此,尽管您可能会加快识别要删除的行的速度,但在实际需要删除它们时,您会牺牲时间。