[英]How can I write query where query with specific where condition?
我有一张带有一个主键和三个外键的表。 这是我的数据表
Id RegistrationId GroupId ItemId Value
2345 68038 677 672 679
3562 68038 357 783 423
8236 NULL 268 578 914
7327 NULL 677 672 467
8733 NULL 357 783 234
我想写查询以获得此结果
Id RegistrationId GroupId ItemId Value
2345 68038 677 672 679
3562 68038 357 783 423
8236 NULL 268 578 914
如您所见,我希望所有具有RegistrationId 68038的行,而且还希望其他GroupId和ItemId具有其他默认值。 我如何编写SQL查询以获取类似上述结果? 感谢您的回应。 如何在MySQL中做到这一点?
您已经标记了多个数据库,并假设它是一个SQL Server。
试试这个查询,它将为您提供所需的输出。
SELECT Id,RegistrationId ,GroupId,ItemId,Value FROM
(
SELECT * ,
ROW_NUMBER() OVER( PARTITION BY GroupId,ItemId ORDER BY RegistrationId DESC) RN
FROM [TABLE_NAME]
) T
WHERE T.RN=1
ORDER BY RegistrationId DESC
示例数据示例
;WITH MY AS
(
SELECT * FROM (VALUES
(2345 , 68038 , 677 , 672 , 679 ),
(3562 , 68038 , 357 , 783 , 423 ),
(8236 , NULL , 268 , 578 , 914 ),
(7327 , NULL , 677 , 672 , 467 ),
(8733 , NULL , 357 , 783 , 234 )
) T(Id,RegistrationId ,GroupId,ItemId,Value)
)
SELECT Id,RegistrationId ,GroupId,ItemId,Value FROM
(
SELECT * ,
ROW_NUMBER() OVER( PARTITION BY GroupId,ItemId ORDER BY RegistrationId DESC) RN
FROM MY
) T
WHERE T.RN=1
ORDER BY RegistrationId DESC
输出:
+------+----------------+---------+--------+-------+
| Id | RegistrationId | GroupId | ItemId | Value |
+------+----------------+---------+--------+-------+
| 3562 | 68038 | 357 | 783 | 423 |
+------+----------------+---------+--------+-------+
| 2345 | 68038 | 677 | 672 | 679 |
+------+----------------+---------+--------+-------+
| 8236 | NULL | 268 | 578 | 914 |
+------+----------------+---------+--------+-------+
我尝试过类似的方法,但它确实有效,但是它采用了硬编码的方式:
SELECT *
FROM MY
WHERE RegistrationId IS NOT NULL
AND GroupId IN (677, 357)
UNION ALL
SELECT *
FROM xxtest_tolga
WHERE GroupId NOT IN (677, 357);
希望对你有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.