基本 Select 不同的问题

Basic Select Distinct issue

嗨,我有这样的数据:

  otord#       otusrn        ottrnc           ojhttn$          ottrnd
----------------------------------------------------------------------
   123           Joe          AAA              100.00         07/17/15
   123           Joe          BBB              100.00         07/16/15

我做了这个 select:我真的想 select 只在订单 # 和 amt 上区分。但我还想展示属于该独特部分的 otusrn 和代码。所以我想要 123 和 100$ 作为唯一值,但 'tag along' 其他列是这将做什么?

SELECT DISTINCT otord#, 
                ohttn$, 
                ottrnd 
FROM replib.clspaytpl 
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701

您的问题是您没有指定要对 "tag along" 列执行的操作,因为它们不是唯一的,您可能对同一条记录有很多结果。您要么必须将它们包含在不同的子句中,要么采用许多可能的记录之一。

如果您真的不关心 "tag along" 列的值,您可以对它们使用 max() 以 return 只有最大值,但请记住,您会丢失数据当它们不同时。所以像 :

SELECT otord#, max(otusrn), max(ottrnc), ojhttn$, max(ottrnd)
FROM replib.clspaytpl 
WHERE otusrn IN ('ANDON', 'SCH', 'JRU', 'BERT', 'TRA', 'LINA')
AND ottrnd >= 20140701
group by otord#, ojhttn$

要仅检索与 header 记录连接的组中的第一条详细记录,您可以使用类似这样的语法:

WITH head (otord#, ojhttn$) as (
  SELECT DISTINCT otord#, ojhttn$
    FROM replib.clspaytpl
    WHERE otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA')
      AND ottrnd >= 20140701)
SELECT h.otord#, h.ojhttn$, d.otusrn, d.ottrnc, d.ottrnd
  FROM head h, 
       TABLE (SELECT * 
          FROM replib.clspaytpl
          WHERE otord# = h.otord# 
            AND ojhttn$ = h.ojhttn$
            AND otusrn in ('ANDON','SCH','JRU','BERT','TRA','LINA)
            AND ottrnd >= 20140701
          FETCH FIRST ROW ONLY) d

如果您有一个真正的 header 文件,每个 order/amount 只包含一条记录,您可以使用它来代替 CTE(通用 Table 表达式)。