我有这张桌子
mt.id, mt.otherId, mt.name, mt.myChar, mt.type
1 10 stack U "question"
2 10 stack D
3 30 stack U "question"
4 10 stack U "whydownvotes"
我只想要 返回id为2和3的行(不使用id,otherid作为参数)并确保名称和类型与参数匹配。当有一个重复的otherId =然后返回具有min myChar值的行。到目前为止,我有这个:
select mt.* from myTable mt
where (mt.myChar = 'U' AND (mt.name = 'stack' AND mt.type LIKE '%question%'))
or (mt.myChar = 'D' and mt.name = 'stack')
所以在otherID为10的情况下,我想要min char值为'D'的行。我将需要使用min(myChar)的子查询或组......?
如何从sql小提琴中删除第一行(不使用id):
http://sqlfiddle.com/#!9/c579a/1
修改的 Jeepers,什么是downvotes,其明确的问题不是吗?甚至还有一个小提琴。
答案 0 :(得分:2)
如果这是SQL Server,那么你可以分两步完成:
WITH filtered AS (
SELECT
mt.*,
minType = MIN(mt.type) OVER (PARTITION BY mt.otherId)
FROM
dbo.myTable AS mt
WHERE (mt.myChar = 'U' AND mt.name = 'stack' AND mt.type LIKE '%question%')
OR (mt.myChar = 'D' AND mt.name = 'stack')
)
SELECT
id,
otherId,
name,
myChar,
type
FROM
filtered
WHERE
type = minType
;
filtered
子查询基本上是您当前的查询,但附加列的每type
个值最小otherId
。主查询会根据filtered
条件进一步过滤type = minType
。
答案 1 :(得分:1)
我假设您想要的是groupwise maximum
,这是您可以尝试的最常见的SQL问题之一,此查询应适用于任何DBMS
。但如果您使用的是SQL SERVER
,那么您可以使用非常容易使用的Row_Number()
。myTable
就在您的桌旁。
SELECT t0.*
FROM myTable AS t0
LEFT JOIN myTable AS t1 ON t0.otherId = t1.otherId AND t1.myChar < t0.myChar
WHERE t1.myChar IS NULL;