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当您有一个索引时,您必须同时从聚集索引和非聚集索引中删除。因此,尽管您可能会加快识别要删除的行的速度,但在实际需要删除它们时,您会牺牲时间。