sql - 如何根据 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 Condition 中的 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
解决方案
我认为通过两次指定 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 |
+-----------+----------+-----------+
推荐阅读
- typescript - 用内部类修改快递请求接口
- authentication - 错误或配置错误?ASP.NET Core 2.1 在拒绝访问时触发 404 错误
- filter - 在 Excel 2016 中使用多列上的相同日期范围进行筛选
- javascript - 从 JSON 中的文件名组装 JSON 文件的 Grunt 任务
- sql - SQL选择省略倍数
- actions-on-google - Google 助理 - 操作未获批准
- c++ - 如何为给定的 boost::spirit 语法向用户提供高级自动完成建议?
- avr - 如何使用 UART 在 avr(atmega16/32) 上连接多个设备?
- react-native - 反应导航如何为每个选项卡动态更改标题导航标题?
- php - 在 PHP 中获取参数和查询