Mysql 使用WHERE语句为每个ID选择一行

Mysql 使用WHERE语句为每个ID选择一行,mysql,sql,oracle,Mysql,Sql,Oracle,我目前正在编写一个SQL语句,在满足要求时,每个ID只能选择一行 假设表组件如下所示: COMP_ID DATE_FROM TIMESTAMP COMP_TRX_ID 1 10-JAN-14 10-JAN-15 5 1 10-JAN-15 10-JAN-14 5 1 10-JAN-12 10-JAN-13 5 1 11-JAN-16 10-JAN-12 5 2 11-JAN-14 10-JAN-15

我目前正在编写一个SQL语句,在满足要求时,每个ID只能选择一行

假设表
组件
如下所示:

COMP_ID  DATE_FROM  TIMESTAMP  COMP_TRX_ID
1        10-JAN-14  10-JAN-15  5
1        10-JAN-15  10-JAN-14  5
1        10-JAN-12  10-JAN-13  5
1        11-JAN-16  10-JAN-12  5
2        11-JAN-14  10-JAN-15  5
2        11-JAN-15  10-JAN-14  5
2        11-JAN-12  10-JAN-13  5
2        11-JAN-16  10-JAN-12  5
COMP_ID  DATE_FROM  TIMESTAMP  COMP_TRX_ID
1        10-JAN-15  10-JAN-14  5
2        11-JAN-15  10-JAN-14  5
现在,我们假设表
组件状态
中的
下一个日期
01-JAN-15

这是我当前编写的
SELECT
语句

SELECT * FROM (SELECT c.* FROM
COMPONENTS c,
COMPONENTS_TRX ct
WHERE 1=1
AND ct.NAME = 'COMP_77C'
AND c.COMP_ID = ct.COMP_ID
AND c.COMP_ID IN (1,2)
AND trunc(c.DATE_FROM) < (SELECT trunc(ADD_MONTHS((NEXT_DATE),1)) FROM (SELECT NEXT_DATE FROM COMPONENT_STATUS
WHERE COMP_REF_CODE = (SELECT ID FROM REF_CODE WHERE CODE = 'COMP_ACTUAL')
ORDER BY NEXT_DATE DESC)
WHERE ROWNUM = 1
))
ORDER BY DATE_FROM DESC, COMP_TIMESTAMP DESC, COMP_TRX_ID DESC
;

仅包含满足要求的第一行?

您可以根据需要使用分组和聚合功能(如
MAX
):

致:


也许我没有理解正确,但是为什么
comp id
DATE\u FROM是
10-JAN-15',而
max(DATE\u FROM)`是
11-JAN-16
?对不起,我还没有理解这个问题。组件表中的日期可能是将来的。似乎有效,但我必须从DESC、COMP\u时间戳DESC、COMP\u TRX\u ID DESC中删除
ORDER BY DATE\u,COMP\u TIMESTAMP DESC、COMP\u TRX\u ID DESC
@dziki添加了别名,现在检查,或使用
ORDER BY 2 DESC、3 DESC、4 DESC
SELECT  COMP_ID,  MAX(DATE_FROM) AS DATE_FROM,
        MAX(TIMESTAMP) AS TIMESTAMP,  MAX(COMP_TRX_ID) AS COMP_TRX_ID
FROM (SELECT c.* 
      FROM
        COMPONENTS c,
        COMPONENTS_TRX ct
      WHERE 1=1
         AND ct.NAME = 'COMP_77C'
         AND c.COMP_ID = ct.COMP_ID
         AND c.COMP_ID IN (1,2)
         AND trunc(c.DATE_FROM) < (SELECTtrunc(ADD_MONTHS((NEXT_DATE),1)) 
                                  FROM (SELECT NEXT_DATE FROM COMPONENT_STATUS
                                  WHERE COMP_REF_CODE = (SELECT ID 
                                                         FROM REF_CODE 
                                                          WHERE CODE = 'COMP_ACTUAL')
      ORDER BY NEXT_DATE DESC)
WHERE ROWNUM = 1
))
GROUP BY COMP_ID
ORDER BY DATE_FROM DESC, COMP_TIMESTAMP DESC, COMP_TRX_ID DESC;
FROM COMPONENTS c,
     COMPONENTS_TRX ct
FROM COMPONENTS c
JOIN COMPONENTS_TRX ct
  ON c.COMP_ID = ct.COMP_ID