我有这张桌子:
我正在尝试将此表中的所有记录从最左侧列中的每个不同ID的DIST_NO列中的最大值中拉出来,但我仍然想要为每个ID中的每个记录提取不同的Product_ID的记录。
我尝试过分区并使用row_number,但我现在遇到了麻烦。
以下是我想要的结果:
这是我目前的代码:
select *
from
(SELECT *,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DIST_NO DESC) RN
FROM Table) V
WHERE RN<=3
答案 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