按栏A分组并按栏B排序时查找行的ID

时间:2019-04-29 13:50:25

标签: mysql sql

我有一个包含许多列的表,但是只有三列是相关的:

id - INT
species - VARCHAR(5)
date - DATE

我想找到以下内容: 对于每种物种,请给我提供日期最少的ID

一种物种的示例数据:

id  | species | date
----------------------------
123 | 03100   | 2007-04-23
----------------------------
324 | 03100   | 2005-05-26

我尝试过按订单分组

SELECT * FROM `table` GROUP BY species ORDER BY `date` ASC;

RESULT:
id  | species | date
----------------------------
123 | 03100   | 2007-04-23

我尝试在分组之前在子选择中订购:

SELECT 
    id, species, `date`
FROM
    (SELECT 
        *
    FROM
        `table`
    ORDER BY `date` ASC) sub
GROUP BY species;

RESULT:
id  | species | date
----------------------------
123 | 03100   | 2007-04-23

结果应该是

id  | species | date
----------------------------
324 | 03100   | 2005-05-26

因为日期是该物种的最早日期。

我们大约有1100种不同的物种,所以我希望如果可以在单个查询中完成而不是对每个物种进行1100个查询。

更新: 预先向您道歉,您的建议很好,但是我很难实现它们,因为我的数据模型比我发布的演示要复杂得多:

TABLE: obs
------------------
id      | INT
species | VARCHAR
user_id | INT
trip_id | INT

TABLE: trips
------------------
trip_id | INT
dato    | DATE

实际上,我必须将obstrips结合在一起才能获得日期,然后必须找到特定user_id

希望您仍然可以帮助我:-)

关于, 安德斯

2 个答案:

答案 0 :(得分:0)

如果您想要最早的记录,我建议您进行过滤,而不是汇总。我将使用相关的子查询:

select t.*
from t
where t.date = (select min(t2.date) from t t2 where t2.species = t.species);

如果您可以有多个日期,并且每个ID仅需要一条记录,则可以将其调整为:

select t.*
from t
where t.id = (select t2.id
              from t t2
              where t2.species = t.species
              order by t2.date asc, t2.id asc
             );

答案 1 :(得分:0)

对于大数据,我建议如下:

from google.cloud import translate

# Instantiates a client
translate_client = translate.Client()

# The text to translate
text = u'this is me'
# The target language
target = 'fr'

# Translates some text into Russian
translation = translate_client.translate(
    text,
    target_language=target, format='text')

print(u'Text: {}'.format(text))
print(u'Translation: {}'.format(translation['translatedText']))