当一列具有重复行时的SQL,然后选择其他列为最小值的行

时间:2015-04-02 16:02:55

标签: sql

我有这张桌子

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,其明确的问题不是吗?甚至还有一个小提琴。

2 个答案:

答案 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;

Here is sql fiddle