如何在SQL中仅基于col /结果选择一行

时间:2019-06-28 07:24:37

标签: sql

这是我的桌子:

日志

    Id   LogCode
   ---------------
    1    111
    2    222
    3    333
    4    444
    5    555

LogsDetails1

Id LogCode StartTime            EndTime                 NQCode
--------------------------------------------------------------------
1  111     06/01/2019 15:00:00  06/01/2019 15:07:00     14

LogsDetails2

Id LogCode StartTime            EndTime                 NQCode
--------------------------------------------------------------------
1  333     06/03/2019 16:00:00  06/03/2019 16:09:00     15

我希望表Logs中的所有记录都具有匹配的Logdetails1Logdetails2

这就是为什么我使用左联接。

结果是这样的

logId LogCode DetailsLogCode StartTime            EndTime              NQCode
-----------------------------------------------------------------------------    
1     111     111            06/01/2019 15:00:00  06/01/2019 15:07:00     14 
1     111       0                       
2     222       0
3     333       0
3     333     333          06/03/2019 16:00:00  06/03/2019 16:09:00     15
4     444       0
5     555       0

当相同的日志代码存在多个时,我只想从两个记录中取出一个记录,一个具有正确的Detailslogcode,另一个则为0。我想选择具有适当值的记录。 Logsdetail表中还有更多列。我不想在开始日期,结束日期上应用条件。这些col可能不会显示一段时间,具体取决于接口条件。

我只想在日志代码上应用con。如果我在Logsdeails上应用max,它将获得该值。那可能给我错误的细节。我不想要列,想要整个行。

1     111     111            06/01/2019 15:00:00  06/01/2019 15:07:00     14 
1      111     0 

我想显示第一条记录,其中LogCode和DetailsLogCode都显示,而不是第二条。

没有匹配项时,显示该内容。

我想要这样的输出:

logId LogCode DetailsLogCode StartTime            EndTime              NQCode
------------------------------------------------------------------------------    
1       111     111           06/01/2019 15:00:00  06/01/2019 15:07:00     14                 
2       222       0
3       333     333           06/03/2019 16:00:00  06/03/2019 16:09:00     15
4       444       0
5       555       0

1 个答案:

答案 0 :(得分:0)

我不知道您的尝试是什么,但希望以下查询能给您带来一些启发。

这里发生的是根据DetailsLogCode进行的条件分组。我还提供了count供参考。如果您需要组中包含有效DetailsLogCode的最新日志,可以通过选择max(StartTime)来实现。

SELECT logId, LogCode, DetailsLogCode, StartTime, EndTime, NQCode, count(*) FROM (SELECT 
  logId, LogCode, DetailsLogCode, StartTime, EndTime, NQCode
FROM LogsDetails1
  JOIN Logs on Logs.Id = LogsDetails1.logId
UNION ALL
SELECT 
  logId, LogCode as LogCode, DetailsLogCode, StartTime, EndTime, NQCode
FROM LogsDetails2
  JOIN Logs on Logs.Id = LogsDetails2.logId) A
  GROUP BY DetailsLogCode, CASE WHEN DetailsLogCode = 0 THEN 1 END
ORDER BY logId;

您可以将this SQL小提琴用作游乐场。