Sql 如何仅查询将超过最大数量的行

Sql 如何仅查询将超过最大数量的行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是A表 +------------+--------+----------+ | LineNumber | Pallet | Location | +------------+--------+----------+ | 1 | a | X | +------------+--------+----------+ | 2 | a | X | +------------+

这是A表

   +------------+--------+----------+
   | LineNumber | Pallet | Location |
   +------------+--------+----------+
   | 1          | a      | X        |
   +------------+--------+----------+
   | 2          | a      | X        |
   +------------+--------+----------+
   | 3          | b      | Y        |
   +------------+--------+----------+
   | 4          | b      | Y        |
   +------------+--------+----------+
   | 5          | b      | Y        |
   +------------+--------+----------+
   | 6          | c      | Z        |
   +------------+--------+----------+
   | 7          | c      | Z        |
   +------------+--------+----------+
   | 8          | c      | Z        |
   +------------+--------+----------+
   | 9          | d      | Q        |
   +------------+--------+----------+
   | 10         | d      | Q        |
   +------------+--------+----------+
这是b表

   +-------------+----------+
   | MaxPalCount | Location |
   +-------------+----------+
   | 2           | X        |
   +-------------+----------+
   | 2           | Y        |
   +-------------+----------+
   | 2           | Z        |
   +-------------+----------+
   | 2           | Q        |
   +-------------+----------+
我想显示的是将超过每个位置最大值的行号。例如,第3行4行5将转到位置Y,但正如您所看到的,该位置的最大pal计数仅为2。第6、7、8行也是如此

所以我想要的查询结果是这样的

   +------------+--------+----------+
   | LineNumber | Pallet | Location |
   +------------+--------+----------+
   | 5          | b      | Y        |
   +------------+--------+----------+
   | 8          | c      | Z        |
   +------------+--------+----------+

将显示将超过的最后一行。我知道可以通过每行抓取来实现这一点。但不使用任何循环方法是否可行?

我的虚拟数据与@Backs相同

DECLARE @Test1 TABLE (
    LineNumber int,
    Pallet nvarchar(10),
    Location nvarchar(10)
)

DECLARE @Tsst2 TABLE (
    MaxPalCount int,
    Location nvarchar(10)
)

INSERT INTO @Test1
(LineNumber,Pallet,Location)
VALUES
(1, 'a', 'X'),
(2, 'a', 'X'),
(3, 'b', 'Y'),
(4, 'b', 'Y'),
(5, 'b', 'Y'),
(6, 'c', 'Z'),
(7, 'c', 'Z'),
(8, 'c', 'Z'),
(9, 'd', 'Q'),
(10, 'd', 'Q')

INSERT INTO @Tsst2
(MaxPalCount, Location)
VALUES
(2, 'X'),
(2, 'Y'),
(2, 'Z'),
(2, 'Q')


SELECT *
FROM
(
    SELECT 
        *,
        ROW_NUMBER()OVER (PARTITION BY t.Pallet ORDER BY t.LineNumber) AS RowId
    FROM @Test1 t
) AS t
INNER JOIN @Tsst2 t2 ON t.Location = t2.Location
WHERE t.RowId > t2.MaxPalCount
而且我认为它应该在位置上进行分区

我使用exists子句而不是内部联接

;WITH Cte
AS (
    SELECT LineNumber
        ,Pallet
        ,Location
        ,ROW_NUMBER() OVER (
            PARTITION BY t.Location ORDER BY t.LineNumber
            ) AS RowId
    FROM @Test1 t
    )
SELECT *
FROM CTE C
WHERE EXISTS (
        SELECT MaxPalCount
        FROM @Tsst2 t1
        WHERE t1.location = c.Location
            AND c.rowid > t1.MaxPalCount
        )

我的虚拟数据与@Backs相同

而且我认为它应该在位置上进行分区

我使用exists子句而不是内部联接

;WITH Cte
AS (
    SELECT LineNumber
        ,Pallet
        ,Location
        ,ROW_NUMBER() OVER (
            PARTITION BY t.Location ORDER BY t.LineNumber
            ) AS RowId
    FROM @Test1 t
    )
SELECT *
FROM CTE C
WHERE EXISTS (
        SELECT MaxPalCount
        FROM @Tsst2 t1
        WHERE t1.location = c.Location
            AND c.rowid > t1.MaxPalCount
        )
与@Backs相同的数据

;WITH cte AS 
(
    SELECT 
        *,
        ROW_NUMBER()OVER (PARTITION BY t.Location ORDER BY t.LineNumber) AS RowId
    FROM @Test1 t
)
SELECT t.LineNumber, t.Pallet, t.Location FROM cte t
INNER JOIN @Tsst2 t2 ON t.Location = t2.Location
WHERE t.RowId = t2.MaxPalCount + 1
与@Backs相同的数据

;WITH cte AS 
(
    SELECT 
        *,
        ROW_NUMBER()OVER (PARTITION BY t.Location ORDER BY t.LineNumber) AS RowId
    FROM @Test1 t
)
SELECT t.LineNumber, t.Pallet, t.Location FROM cte t
INNER JOIN @Tsst2 t2 ON t.Location = t2.Location
WHERE t.RowId = t2.MaxPalCount + 1

sql server的哪个版本?版本是2008:)我尝试按行获取数据,然后将一个变量设置为行计数,如果计数超过最大计数,最后将检查该变量。但我无法实现这一点,因为这将花费太多的时间。。由于表中的每个详细信息都将同时查询至少10k条记录,所以sql server的版本是什么?版本是2008:)我尝试每行获取一个变量,然后将其作为行计数,最后,如果计数超过位置最大计数,将对其进行检查。但我无法实现这一点,因为这将花费太多的时间。。由于表中的每个细节都将被查询,因此至少有10k条记录同时被查询。这似乎更准确!是的。这似乎更准确!