选择一列的TOP 1,按重复ID和其他唯一字段进行分组

问题描述 投票:1回答:3

基于选择不同列中的最高序列(Account_Occupant),我正在努力查询数据,我只需要一行表中的一行(数千)。

我需要返回一个不同的帐号(90006),最高的account_occupant(11)和与该account_occupant(MICHAEL)对应的名称。这是一个数据样本:

Account_NUM Account_Occupant    Name
90006           1               JOHN
90006           2               MARY
90006           3               MARY
90006           4               KERRI
90006           5               PATRICIA
90006           6               DARYL
90006           7               ASHLEY
90006           8               DARYL
90006           9               DIANE
90006           10              DARYL
90006           11              MICHAEL

我需要返回的一个例子是:

Account_NUM Account_Occupant    Name
90006           11              MICHAEL

这是最近的查询尝试:

    SELECT 
    DISTINCT CIS.Account_NUM
        ,(
            SELECT top 1 CISa.Account_Occupant 
            FROM database.view CISa 
            WHERE CISa.Account_NUM = CIS.Account_NUM 
            ORDER BY CISa.Account_Occupant DESC
         ) AS Newest_Occupt_Num
    , CIS.name
    FROM database.view CIS
    WHERE EXISTS 
        (
            SELECT TOP 1 CIS2.Account_Occupant 
            FROM database.view CIS2 
            WHERE CIS.Account_NUM = CIS2.Account_NUM 
            AND CIS.Account_Occupant = CIS2.Account_Occupant 
            ORDER BY CIS2.Account_NUM, CIS2.Account_Occupant DESC
        )
    ORDER BY 1,2

我已经做了相当多的搜索和尝试变体group by,group by在where语句中,我在本论坛中找到的子选择和union语句,但仍然没有正确。编辑道歉要求人们提出问题,指出我提问中的错误 - 非常感谢。

sql sql-server
3个回答
1
投票

您可以尝试另一种方法。

CREATE TABLE TBL(Account_NUM VARCHAR(100),Account_Occupant INT,Name VARCHAR(100))

INSERT INTO TBL
SELECT '123',11,'ABC'

INSERT INTO TBL
SELECT '123',12,'XYZ'


INSERT INTO TBL
SELECT '124',11,'ABC'


INSERT INTO TBL
SELECT '124',12,'XYZ'


SELECT DISTINCT T.*, T1.Name FROM
(
   SELECT Account_NUM, MAX(Account_Occupant) OVER (PARTITION BY Account_NUM) AS MAX_Account_Occupant
   FROM TBL
 ) T
 INNER JOIN TBL T1 ON T1.Account_NUM= T.Account_NUM AND T1.Account_Occupant=T.MAX_Account_Occupant

产量

    Account_NUM MAX_Account_Occupant    Name
   ------------ --------------------   ----- 
    123               12                XYZ
    124               12                XYZ

1
投票

如果我正确理解您的描述,则不需要分组。一个简单的降序将给你想要你想要的:

SELECT TOP 1 Account_NUM, Account_Occupant, Name
FROM table1
ORDER BY Account_Occupant DESC

如果您的问题中除Account_NUM以外的90006数据库中有其他记录,并且您只想要这个Account_NUM,那么只需添加一个条件:

SELECT TOP 1 Account_NUM, Account_Occupant, Name
FROM table1
WHERE Account_NUM = 90006
ORDER BY Account_Occupant DESC

1
投票

如果您正在寻找前1个PER Account_Num,那么这只是另一种选择。

我提交这个只是因为你正在寻找GROUP BY和JOIN

Select Top 1 with ties *
 From  YourTable 
 Order By Row_Number() over (Partition By Account_NUM Order By Account_Occupant Desc)
© www.soinside.com 2019 - 2024. All rights reserved.