0

我需要做的是为 columncol7的每个不同值获取 column 的 MAX 值col6。下面的示例数据。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
4

3 回答 3

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
于 2012-07-05T23:35:13.263 回答
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;
于 2012-07-05T23:48:27.597 回答
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

我将使用上面的解决方案,因为这是我需要学习的东西。感谢您的快速回复。

于 2012-07-05T23:50:57.340 回答