我正在使用SQL Server 2008,如果存在重复的orderno且activityCode等于0,我希望仅在等于1时获取orderno的activityCode。 此外,如果orderno activityCode的记录等于0,那么也会显示这些记录。但是我只想在activityCode等于0时显示orderno,如果相同的orderno activityCode不等于1或者activityCode只等于0.我希望这是明确的并且有意义但是如果我需要提供更多细节请告诉我。感谢
- 创建表
create table po_v
(
orderno int,
amount number,
activityCode number
)
- 插入值
insert into po_v values
(170268, 2774.31, 0),
(17001988, 288.82, 0),
(17001988, 433.23, 1),
(170271, 3786, 1),
(170271, 8476, 0),
(170055, 34567, 0)
- 结果
170268 | 2774.31 | 0
17001988 | 433.23 | 1
170271 | 3786 | 1
170055 | 34567 | 0
*****更新***** 我已插入两条新记录,结果已更新。实际表中的数据除了0和1之外还有其他数字.select语句显示正确的orderno但我希望orderno的其他记录也显示。该分区仅为每个orderno填充一条记录。如果可能的话,我希望看到具有相同activityCode的记录。
- 插入值
insert into po_v values
(170271, 3799, 1),
(172525, 44445, 2)
--select statement
SELECT Orderno,
Amount,
Activitycode
FROM (SELECT orderno,
amount,
activitycode,
ROW_NUMBER()
OVER(
PARTITION BY orderno
ORDER BY activitycode DESC) AS dup
FROM Po_v)dt
WHERE dt.dup = 1
ORDER BY 1
- 选择陈述结果
170055 | 34567 | 0
170268 | 2774.31 | 0
170271 | 3786 | 1
172525 | 44445 | 2
17001988 | 433.23 | 1
- 预期结果
170055 | 34567 | 0
170268 | 2774.31 | 0
170271 | 3786 | 1
170271 | 3799 | 1
172525 | 44445 | 2
17001988 | 433.23 | 1
答案 0 :(得分:1)
不完全清楚你在这里尝试做什么,但这会返回你期望的输出。
select orderno
, amount
, activityCode
from
(
select *
, RowNum = ROW_NUMBER() over(partition by orderno order by activityCode desc)
from po_v
) x
where x.RowNum = 1
<强> --- --- EDIT 强>
有了新的细节,这是一个非常不同的问题。据我所知,你现在希望它的所有行共享每个orderno的最大活动代码。你可以用cte轻松地做到这一点。
with MyGroups as
(
select orderno
, Activitycode = max(activitycode)
from po_v
group by orderno
)
select *
from po_v p
join MyGroups g on g.orderno = p.orderno
and g.Activitycode = p.Activitycode
答案 1 :(得分:0)
试试这个
SELECT Orderno,
Amount,
Activitycode
FROM (SELECT orderno,
amount,
activitycode,
ROW_NUMBER()
OVER(
PARTITION BY orderno
ORDER BY activitycode DESC) AS dup
FROM Po_v)dt
WHERE dt.dup = 1
ORDER BY 1
结果
Orderno Amount Activitycode
------------------------------------
170055 34567.00 0
170268 2774.31 0
170271 3786.00 1
17001988 433.23 1