我需要做的是为列col7
的每个不同值获取列col6
的MAX值。以下示例数据。 IPX
是PK。
结果应该是
IPX col1 col2 col3 col4 col5 col6 col7
2097177 32 25 1 3 20 10011 19
2097465 32 313 15 5 246 10012 245
2097783 32 631 27 7 440 10013 439
我可以将它们全部选入临时表并获得最大值,但我认为有查询来获得这些结果,我只是想不出来。谢谢你的帮助。
IPX col1 col2 col3 col4 col5 col6 col7
2097157 32 5 0 3 4 10011 3
2097159 32 7 0 5 6 10011 5
2097161 32 9 0 7 8 10011 7
2097163 32 11 0 9 10 10011 9
2097169 32 17 0 11 12 10011 11
2097171 32 19 0 13 14 10011 13
2097173 32 21 0 15 16 10011 15
2097175 32 23 1 1 18 10011 17
2097177 32 25 1 3 20 10011 19
2097440 32 288 14 1 226 10012 225
2097442 32 290 14 3 228 10012 227
2097444 32 292 14 5 230 10012 229
2097446 32 294 14 7 232 10012 231
2097448 32 296 15 15 256 10012 255
2097456 32 304 16 15 272 10012 271
2097457 32 305 14 13 238 10012 237
2097459 32 307 14 15 240 10012 239
2097461 32 309 15 1 242 10012 241
2097463 32 311 15 3 244 10012 243
2097465 32 313 15 5 246 10012 245
2097729 32 577 25 1 402 10013 401
2097731 32 579 25 3 404 10013 403
2097733 32 581 25 5 406 10013 405
2097735 32 583 25 7 408 10013 407
2097737 32 585 25 9 410 10013 409
2097745 32 593 25 11 412 10013 411
2097747 32 595 25 13 414 10013 413
2097749 32 597 25 15 416 10013 415
2097751 32 599 26 1 418 10013 417
2097753 32 601 26 3 420 10013 419
2097760 32 608 26 5 422 10013 421
2097762 32 610 26 7 424 10013 423
2097764 32 612 26 9 426 10013 425
2097766 32 614 26 11 428 10013 427
2097768 32 616 26 13 430 10013 429
2097776 32 624 26 15 432 10013 431
2097777 32 625 27 1 434 10013 433
2097779 32 627 27 3 436 10013 435
2097781 32 629 27 5 438 10013 437
2097783 32 631 27 7 440 10013 439
答案 0 :(得分:1)
试试这个:
WITH Data AS
(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY col6 ORDER BY col7 DESC) AS Position
FROM <YOUR-TABLE> a
)
SELECT IPX, col1, col2, col3, col4, col5, col6, col7
FROM Data
WHERE Position = 1
答案 1 :(得分:0)
如果您使用的是SQL Server 2000,那么您需要执行以下操作:
SELECT x.IPX, x.col1, x.col2, x.col3, x.col4, x.col5, x.col6, x.col7
FROM dbo.unspecified_table_name AS x
INNER JOIN (SELECT col6, col7 = MAX(col7)
FROM dbo.unspecified_table_name
GROUP BY col6) AS y
ON x.col6 = y.col6
AND x.col7 = y.col7;
请注意,如果出现平局,这将产生多行。
在SQL Server 2005中,您可以选择是否要在出现平局时显示多行。这将选择一个任意行:
;WITH x AS
(
SELECT IPX, col1, col2, col3, col4, col5, col6, col7,
rn = ROW_NUMBER() OVER (PARTITION BY col6 ORDER BY col7 DESC)
FROM dbo.unspecified_table_name
)
SELECT IPX, col1, col2, col3, col4, col5, col6, col7
FROM x
WHERE rn = 1;
如果您知道如何打破平局,可以向ORDER BY
添加标准。例如,如果要选择IPX值最低的行,可以说:
;WITH x AS
(
SELECT IPX, col1, col2, col3, col4, col5, col6, col7,
rn = ROW_NUMBER() OVER (PARTITION BY col6 ORDER BY col7 DESC, IPX)
FROM dbo.unspecified_table_name
)
SELECT IPX, col1, col2, col3, col4, col5, col6, col7
FROM x
WHERE rn = 1;
如果您想要返回两行,只需将ROW_NUMBER()
更改为RANK()
:
;WITH x AS
(
SELECT IPX, col1, col2, col3, col4, col5, col6, col7,
rn = RANK() OVER (PARTITION BY col6 ORDER BY col7 DESC)
FROM dbo.unspecified_table_name
)
SELECT IPX, col1, col2, col3, col4, col5, col6, col7
FROM x
WHERE rn = 1;
答案 2 :(得分:0)
SELECT f1.col6, f1.col7
FROM tmp_DO_CLOSE_tbl f1
WHERE col7 = (
SELECT MAX(f2.col7)
FROM tmp_DO_CLOSE_tbl f2
WHERE f1.col6 =f2.col6
)
ORDER BY col6, col7
我将使用上面的解决方案,因为这是我需要学习的东西。感谢您的快速回复。