获取列A sql的每个不同值的列B的最大值

时间:2016-10-25 19:57:19

标签: sql sql-server-2008 tsql

我有这张桌子:

enter image description here

我正在尝试将此表中的所有记录从最左侧列中的每个不同ID的DIST_NO列中的最大值中拉出来,但我仍然想要为每个ID中的每个记录提取不同的Product_ID的记录。

我尝试过分区并使用row_number,但我现在遇到了麻烦。

以下是我想要的结果:

Desired Results

这是我目前的代码:

select *
from
    (SELECT *,
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DIST_NO DESC) RN
    FROM Table) V
WHERE RN<=3

5 个答案:

答案 0 :(得分:1)

您希望每个max(DIST_NO)都有ID, product_ID吗? 如果是这样,你可以:

SELECT
ID, product_ID, max(DIST_NO)
from table
group by ID, product_ID

如果您想要与最大行相关的详细信息行,您只需将其加入表格即可:

Select
    t.ID, max_dist_no, TRANSaction_ID     , LINE_NO     , PRODUCT_ID
from
table t inner join
(SELECT
    ID, max(DIST_NO) as max_dist_no
    from table
    group by ID) mx on
t.ID = mx.ID and
t.DIST_NO = max_DIST_NO

答案 1 :(得分:0)

尝试

SELECT MT.ID
     , MT.DIST_NO
     , MT.TRANS_ID
     , MT.LINE_NO
     , MT.PRODUCT_ID
  FROM MYTABLE MT 
      INNER JOIN (
           SELECT T.ID, MAX(T.DIST_NO) as DIST_NO FROM MYTABLE T
           GROUP BY T.ID
      ) MAX_MT ON MT.Id = MAX_MT.ID AND MT.DIST_NO = MAX_MT.DIST_NO

子查询返回DIST_NO的ID和Max值的每个组合:

 SELECT T.ID, MAX(T.DIST_NO) as DIST_NO FROM MYTABLE T
           GROUP BY T.ID

将此表连接到原始表格基本上只会按这些值组合过滤原始数据集。

答案 2 :(得分:0)

使用rank()dense_rank()

select t.*
from (SELECT t.*
             RANK() OVER (PARTITION BY ID ORDER BY DIST_NO DESC) as seqnum
      FROM Table t
     ) t
WHERE seqnum = 1;

这几乎是您的请求的字面翻译:

  

我正在尝试从此表中提取所有记录以获取最大值   最左列中每个不同ID的DIST_NO列。

答案 3 :(得分:0)

在PostgreSQL上测试:

WITH t1 AS (
    SELECT id, product_id, MAX(dist_no) AS dist_no 
    FROM test
    GROUP BY 1,2)
SELECT t1.id, t1.dist_no, t2.trans_id, t2.line_no, t1.product_id
FROM test t2, t1
WHERE t1.id=t2.id AND t1.product_id=t2.product_id AND t1.dist_no=t2.dist_no

答案 4 :(得分:0)

你可以试试这样的东西:)。 (但你的结果是否正确?我认为在TRANS_ID中没有错误......)

DECLARE @ExampleTable TABLE 
        (ID INT,
         DIST_NO INT,
         TRANS_ID INT,
         LINE_NO INT,
         PRODUCT_ID INT)

INSERT INTO @ExampleTable
        ( ID, DIST_NO, TRANS_ID,LINE_NO, PRODUCT_ID )
VALUES  ( 102657,  1,  1105365,  1,  109119   ),
        ( 102657,  1,  1105366,  2,  109114   ),
        ( 102657,  2,  1105365,  1,  109119   ),
        ( 102657,  2,  1105366,  2,  109114   ),
        ( 104371,  1,  1190538,  1,  110981   ),
        ( 104371,  2,  1190538,  1,  110981   )


;WITH CTE AS ( SELECT DISTINCT ID, LINE_NO
                FROM @ExampleTable)

SELECT a.ID, 
       x.DIST_NO, 
       x.TRANS_ID, 
       x.LINE_NO, 
       x.PRODUCT_ID
FROM CTE a
CROSS APPLY (SELECT TOP 1 * 
               FROM @ExampleTable f 
             WHERE a.ID = f.ID AND 
                   a.LINE_NO = f. LINE_NO 
             ORDER BY DIST_NO DESC) x
相关问题