2016-10-25 218 views
1

我有这个表:每列的每个不同的值获取B列的最大值一个SQL

enter image description here

我试图从该表中把所有的记录在DIST_NO列中的最大值对于最左列中的每个不同的ID,但我仍然想要为每个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 
+3

编辑你的问题,并在问题中包含样本数据和所需结果*作为文本*。 –

+0

我不能将示例数据添加到我的问题中,因为我需要更高的信誉点,但对于期望的结果,我希望看到 –

回答

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 

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

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

将此加回到原始表格中将基本上只用这些值组合来过滤原始数据集。

+0

为什么不让您的子查询成为CTE以提高可读性? – EMUEVIL

+0

而我更喜欢当前的派生表版本。由于不是所有的dbms产品都支持cte,所以也更加便于携带。 – jarlh

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 
+0

不会返回所需的结果。 – jarlh

+0

感谢您向您的问题添加所需的结果。 – Beth

+0

感谢贝丝的回应,你可以在原始查询和子查询中都有'max_dist_no'。使用此表单进行查询时出现错误。 –

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; 

这几乎是您的请求的直译:

我试图从该表中把所有记录的最大值在 的DIST_NO列在最左边的列中的每个不同的ID。

+0

如果有多个产品ID,这仍然会返回一个不同ID的多个记录吗? –

+0

@TristanS。 。 .. 是的,它会。这是'row_number()'和秩函数之间的区别。 –

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 
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 
相关问题