我有一个项目数据库,可以在一个单独的行中存储给定项目的每个可用种类。只需按项目名称,数据库记录如下所示:
10316-00-B
10316-00-M
10316-02-B
10316-03-B
10316-04-B
10316-23-B
10316-88-B
......其中" 10316"是实际的项目,然后之后的所有内容代表特定的品种类型。我想编写一个查询,只返回项目的一条记录" 10316" (或其中任何一个),以及与所有其他表列中该项相关联的信息,并忽略其余的。所以我会得到项目" 10316-00-B"的记录,但没有其他的。对于我的查询返回的所有其他项,此过程将重复。
我并不挑剔某个特定组的哪个项目被退回;最重要的是。我只是看到项目10316,10317,10318及其后的每个项目,而不是每个项目和变体。
我已经尝试了DISTINCT左(columnName,5),但是并没有按照我的需要过滤记录。有谁知道如何做到这一点?我使用的是Sql Server 2008 R2。
更新:我正在尝试实施@ mo2提供的解决方案 - 看起来这个最有可能返回给定项目的所有数据,这就是我想要的。不幸的是,我收到了错误"没有为第1列''"指定列名,我不知道如何更正此错误。我的查询版本如下所示:
SELECT * FROM (
select left(item, 5), col1, col2, ... , row_number()
over (partition by LEFT(item, 5) order by item) rn
from Table
) t
where rn = 1
最终更新:我将@kbball的答案标记为解决方案,但真的应该归功于@ mo2。 @kbball的答案帮助我理解了@ mo2的答案。
答案 0 :(得分:1)
如果您只是单独查找一列,那么区别是可行的。但是当你添加你需要的剩余列时,它就会被抛弃。你可以试试这个:
select * from (
select
left(col1, 5) col1,
col2,
col3,
col4,
row_number() over (partition by left(col1, 5) order by col1) rn
from your_table
) t
where rn = 1
如果您想获取每个项目的第一个或最后一个记录,可以将order by
更改为其他列,例如日期/时间列。
答案 1 :(得分:0)
您希望将特定品种类型作为每个项目的单独字段,就像数据库设计的一般技术一样:
10316 | 00 |乙
然后您可以使用:
进行查询SELECT DISTINCT(item)
FROM itemlist
WHERE itemnum=10316;
希望这有帮助
答案 2 :(得分:0)
This one is a little simpler:
SELECT DISTINCT sub.item
FROM (SELECT LEFT(columnName,5) AS item FROM Table) sub