我要做的是通过表格并根据某个字段返回半独特的结果。例如,使用此数据
field1 segment field2 field3 field4 etc
-----------------------------------------------
xxxx S1 xxx xxx xxx xxx
xxxx S4 xxx xxx xxx xxx
xxxx S1 xxx xxx xxx xxx
xxxx S2 xxx xxx xxx xxx
xxxx S2 xxx xxx xxx xxx
xxxx S1 xxx xxx xxx xxx
xxxx S3 xxx xxx xxx xxx
我想要做的是返回每个段类型的1条记录。其他数据应来自所选记录,但只要我为每个段类型获得1条唯一记录,哪条记录无关紧要。
field1 segment field2 field3 field4 etc
-----------------------------------------------
xxxx S1 xxx xxx xxx xxx
xxxx S4 xxx xxx xxx xxx
xxxx S2 xxx xxx xxx xxx
xxxx S3 xxx xxx xxx xxx
希望这是有道理的。此外,这将针对Oracle运行,因此无论采用哪种最有效的方式都可以做到这一点(源表将包含10 mil记录和30个不同的段)
答案 0 :(得分:2)
您可以执行类似
的操作SELECT segment,
field1,
field2,
field3,
field4
FROM (SELECT segment,
field1,
field2,
field3,
field4,
row_number() over (partition by segment order by rownum) rnk
FROM table_name)
WHERE rnk = 1
这将为每个SEGMENT
选择一个任意行。在将来有人决定他们确实关心选择哪一行时,您可以在分析函数中调整ORDER BY。
答案 1 :(得分:0)
我知道当您只想返回段列时,此技术有效。
SELECT DISTINCT segment
FROM YOUR_TABLE_NAME
但是,当你尝试查询时:
SELECT DISTINCT SEGMENT, FIELD2, FIELD3
FROM YOUR_TABLE_NAME
WHERE BLAH = BLAH
对于每个具有不同信息的细分,这将返回多行。
此问题似乎与here发现的问题类似。
如果我没有正确理解你的问题,请发表评论=)
答案 2 :(得分:0)
如果您不想键入所有字段名称:
SELECT *
FROM table_name t0 WHERE NOT EXISTS (
SELECT * FROM table_name t1
WHERE t1.segment = t0.segment
AND t1.ROWNUM < t0.ROWNUM
;
我不知道在oracle中究竟是如何调用tuple-id / rownumber / object-id的,但我确定它存在。