首页 > 解决方案 > 如何根据 Where 条件选择 MAX 值

问题描述

我的示例数据集如下所示:

Declare @tbl Table (IP VARCHAR(20),IP_Name VARCHAR(30),IP_ID VARCHAR(50))
INSERT INTO  @tbl(IP,IP_Name,IP_ID)VALUES('168.0.0.0','MOHAN-1','AAAAXDXYM')
INSERT INTO  @tbl(IP,IP_Name,IP_ID)VALUES('168.0.0.0','MOHAN-2','BBBYYDDMM')
INSERT INTO  @tbl(IP,IP_Name,IP_ID)VALUES('168.0.1.2','MANASA-1','YYYYMMMD')
INSERT INTO  @tbl(IP,IP_Name,IP_ID)VALUES('168.0.1.2','MANASA-2','JJJKKKLL')
INSERT INTO  @tbl(IP,IP_Name,IP_ID)VALUES('168.0.1.3','Vijay-1','XXLLLLXXX')
INSERT INTO  @tbl(IP,IP_Name,IP_ID)VALUES('168.0.1.3','Vijay-2','SSKSKSLL')

Select * from  @tbl

样本数据

IP         IP_Name      IP_ID
168.0.0.0   MOHAN-1   AAAAXDXYM
168.0.0.0   MOHAN-2   BBBYYDDMM
168.0.1.2   MANASA-1  YYYYMMMD
168.0.1.2   MANASA-2  JJJKKKLL
168.0.1.3   Vijay-1   XXLLLLXXX
168.0.1.3   Vijay-2   SSKSKSLL

我想根据 WHERE Con​​dition 中的 IP 获得。

例如,如果我给

WHERE IP IN ('168.0.0.0','168.0.1.2','168.0.1.2','168.0.1.3')

输出 :

  IP         IP_Name       IP_ID
168.0.0.0   MOHAN-2     BBBYYDDMM
168.0.1.2   MANASA-1    YYYYMMMD
168.0.1.2   MANASA-2    JJJKKKLL
168.0.1.3   Vijay-2     SSKSKSLL

脚本

  ;WITH CTE AS (
    Select *,
ROW_NUmber()OVER(PARTITION BY IP_Name ORDER BY IP_Name DESC)RN from  @tbl WHERE IP IN ()
    )
    Select * from  CTE WHERE RN = 1

标签: sqlsql-servertsql

解决方案


我认为通过两次指定 IP ('168.0.0.0','168.0.1.2','168.0.1.2','168.0.1.3'),您希望获得该特定 IP 的两条记录。

如果是这种情况,您可以尝试如下。

SELECT ip,IP_NAME,IP_ID 
FROM   (SELECT t.*, 
               i.ct, 
               Row_number() 
                 OVER ( 
                   partition BY t.ip 
                   ORDER BY ip_name DESC) AS seqnu 
        FROM   @tbl t 
               INNER JOIN ( VALUES ('168.0.0.0',1), 
                                   ('168.0.1.2',2), 
                                   ('168.0.1.3',1) )i(ip, ct) 
                       ON t.ip = i.ip) t 
WHERE  t.seqnu <= t.ct 
ORDER BY IP, IP_NAME

在线演示

输出

+-----------+----------+-----------+
| IP        | IP_NAME  | IP_ID     |
+-----------+----------+-----------+
| 168.0.0.0 | MOHAN-2  | BBBYYDDMM |
+-----------+----------+-----------+
| 168.0.1.2 | MANASA-1 | YYYYMMMD  |
+-----------+----------+-----------+
| 168.0.1.2 | MANASA-2 | JJJKKKLL  |
+-----------+----------+-----------+
| 168.0.1.3 | Vijay-2  | SSKSKSLL  |
+-----------+----------+-----------+

推荐阅读